Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用替换和正则表达式应用货币格式_Javascript_Regex - Fatal编程技术网

Javascript 使用替换和正则表达式应用货币格式

Javascript 使用替换和正则表达式应用货币格式,javascript,regex,Javascript,Regex,我试图理解一些将数字转换为货币格式的代码。因此,如果您有16.9美元,它将转换为16.90美元。代码的问题是,如果金额超过1000美元,它只返回1美元,超过2000美元返回2美元,以此类推。成百上千的金额显示为罚款 以下是函数: var _formatCurrency = function(amount) { return "$" + parseFloat(amount).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,') }; (括号后面

我试图理解一些将数字转换为货币格式的代码。因此,如果您有16.9美元,它将转换为16.90美元。代码的问题是,如果金额超过1000美元,它只返回1美元,超过2000美元返回2美元,以此类推。成百上千的金额显示为罚款

以下是函数:

var _formatCurrency = function(amount) {
    return "$" + parseFloat(amount).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
};
(括号后面加分号的原因是因为该函数本身是另一个函数中的语句。该函数与本讨论无关。)

我发现最初将代码放入其中的人在某个地方找到了它,但没有完全理解它,也没有测试这个特定场景。我本人并没有太多地处理正则表达式。我不仅试图修复它,而且想了解它现在是如何工作的


这是我发现的。开括号后的反斜杠和
g
前的反斜杠之间的代码是模式。
g
表示全局搜索。
\d
表示数字,
(?=\d{3})+.
表示查找3位数字加一个小数点。我不确定我是否有这个权利,因为如果这是正确的,它不应该忽略像5.4这样的数字吗?那很好。另外,我不确定
“$1”是做什么用的。在我看来,它应该放在数字所在的位置,但这不会把所有数字都改成1美元吗?另外,为什么在1后面有一个逗号?

假设您只使用USD,那么这应该是正则表达式的替代方法。我还包括了一些测试来验证它是否正常工作

var test1='16.9'; var test2='2000.5'; var test3='300000.23'; var test4='3000000.23'; 函数StringToSD(inputString){ const splitValues=inputString.split('.'); 常量wholeNumber=splitValues[0]。拆分(“”) .map(val=>parseInt(val)) .reverse() .map((val,idx,arr)=>idx!==0&&(idx+1)%3==0&&arr[idx+1]!==未定义?`,${val}`:val) .reverse() .加入(“”); 返回parseFloat(`${wholeNumber}.${splitValues[1]}`).toFixed(2); } log(stringToUSD(test1)); log(stringToUSD(test2)); log(stringToUSD(test3));
log(stringToUSD(test4))模式无效,您对函数的理解不正确。此函数将数字格式化为标准美国货币,其工作原理如下:

  • parseFloat()
    函数将字符串值转换为十进制数
  • toFixed(2)
    函数将十进制数舍入到小数点后的2位
  • 此处使用
    replace()
    函数添加千位分隔符(即每3位后面加一个逗号)。模式不正确,因此建议使用以下修复方法
    /(\d)(?=(\d{3})+\)/g
    ,其工作原理如下:
    • (\d)
      捕获一个数字
    • (?=(\d{3})+\)
      称为向前看,它确保上面捕获的数字有一组3位
      (\d{3})
      或更多
      +
      后跟小数点
      \。
      后跟小数点
    • g
      标志/修饰符用于全局应用模式,即在整个金额上应用模式
    • 替换
      $1,
      将模式替换为第一个捕获的组
      $1
      ,在我们的例子中,该组是数字
      (\d)
      (因此从技术上讲,将数字替换为数字本身以确保在替换中不会丢失数字),后跟逗号
      。就像我说的,这只是为了添加千分位
  • 下面是一些建议修复的测试。请注意,它适用于数字和字符串:

    var\u formatCurrency=函数(金额){
    返回“$”+parseFloat(amount).toFixed(2).替换(/(\d)(?=(\d{3})+\)/g,'$1');
    };
    console.log(_formatCurrency('1'));
    console.log(_formatCurrency('100'));
    console.log(_formatCurrency('1000'));
    console.log(_formatCurrency('1000000.559'));
    console.log(_formatCurrency('1000000000.559');
    console.log(_formatCurrency(1));
    console.log(_formatCurrency(100));
    console.log(_formatCurrency(1000));
    console.log(_formatCurrency(1000000.559));
    
    console.log(_formatCurrency(1000000000.559))关于您的评论

    我希望编辑正则表达式,这样它就可以正常工作了

    你目前使用的正则表达式显然不能为你工作,所以我认为你应该考虑替代品,即使它们不是太相似,并且

    试图使代码更改尽可能小

    可以理解,但有时使用稍微大一点、可读性更强的代码比使用简洁和象形文字要好

    恢复营业:

    我假设你得到一个字符串作为参数,这个字符串只由数字组成,在最后1或2个数字之前可能有点,也可能没有点。差不多

    //input     //intended output
    1           $1.00
    20          $20.00
    34.2        $34.20
    23.1        $23.10
    62516.16    $62,516.16
    15.26       $15.26
    4654656     $4,654,656.00
    0.3         $0.30
    
    我将让您对(假定的)非有效项进行预检查,如1。2.2。.64.8.14.856

    提议的解决办法:
    var\u formatCurrency=函数(金额){
    amount=“$”+amount.replace(/(\d)(?=(\d{3})+(\(\d{0,2})*$)/g,“$1”);
    if(amount.indexOf('.')=-1)
    退货金额+'.00';
    风险值小数=金额分割('.')[1];
    返回小数。长度<2?金额+0:金额;
    };
    
    正则表达式细分:
    • (\d)
      :匹配一位数字。括号用于在需要时进行引用

    • (?=(\d{3})+(\.(\d{0,2})*$)
      。现在这个家伙。从头到尾:

      • $
        :匹配字符串的结尾。这使您可以从末尾而不是从开头进行匹配,这对于添加逗号非常方便
      • <
        var _formatCurrency = function(amount) {
            amount = "$" + amount.replace(/(\d)(?=(\d{3})+(\.(\d){0,2})*$)/g, '$1,');
        
            if(amount.indexOf('.') === -1)
                return amount + '.00';
        
            var decimals = amount.split('.')[1];
        
            return decimals.length < 2 ? amount + '0' : amount;
        };