changeset 24820:b1093c1ac109 v8.2.2948

patch 8.2.2948: substitute() accepts a number but not a float expression Commit: https://github.com/vim/vim/commit/7a2217bedd223df4c8bbebe731bf0b5fe8532533 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 6 12:33:49 2021 +0200 patch 8.2.2948: substitute() accepts a number but not a float expression Problem: Substitute() accepts a number but not a float expression. Solution: Also accept a float. (closes https://github.com/vim/vim/issues/8331)
author Bram Moolenaar <Bram@vim.org>
date Sun, 06 Jun 2021 12:45:02 +0200
parents 8b478ce70f4d
children 0218caefb9b8
files src/testdir/test_substitute.vim src/typval.c src/version.c
diffstat 3 files changed, 17 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_substitute.vim
+++ b/src/testdir/test_substitute.vim
@@ -1,6 +1,7 @@
 " Tests for multi-line regexps with ":s".
 
 source shared.vim
+source check.vim
 
 func Test_multiline_subst()
   enew!
@@ -453,6 +454,13 @@ func Test_substitute_partial()
    call assert_fails("call substitute('123', '2', Replacer, 'g')", 'E118:')
 endfunc
 
+func Test_substitute_float()
+  CheckFeature float
+
+  call assert_equal('number 1.23', substitute('number ', '$', { -> 1.23 }, ''))
+  vim9 assert_equal('number 1.23', substitute('number ', '$', () => 1.23, ''))
+endfunc
+
 " Tests for *sub-replace-special* and *sub-replace-expression* on :substitute.
 
 " Execute a list of :substitute command tests
--- a/src/typval.c
+++ b/src/typval.c
@@ -462,8 +462,13 @@ tv_get_string_buf_chk_strict(typval_T *v
 	    break;
 	case VAR_FLOAT:
 #ifdef FEAT_FLOAT
-	    emsg(_(e_float_as_string));
-	    break;
+	    if (strict)
+	    {
+		emsg(_(e_float_as_string));
+		break;
+	    }
+	    vim_snprintf((char *)buf, NUMBUFLEN, "%g", varp->vval.v_float);
+	    return buf;
 #endif
 	case VAR_STRING:
 	    if (varp->vval.v_string != NULL)
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2948,
+/**/
     2947,
 /**/
     2946,