逗号格式的数字

Posted

技术标签:

【中文标题】逗号格式的数字【英文标题】:Comma format a number 【发布时间】:2011-12-28 13:56:55 【问题描述】:

我需要将带逗号的数字格式化为千位分隔符,例如:

1234 = 1,234
1234.50 = 1,234.50
12345.60 = 12,345.60
123456.70 = 123,456.70
1234567.80 = 1,234,567.80
etc etc

这需要适用于具有十进制值或没有十进制值的数字 即 1234567.80 和 1234567

这是针对 Coldfusion / Flash 应用程序中的 Actionscript 2,因此使用的是普通的 actionscript。我在网上看到了几个解决方案,但没有一个能奏效。

到目前为止,我有以下功能,但提供小数时格式不正确。例如:21898.5 变为 2,188,8.5。

请您帮我找到错误或提供满足要求的替代解决方案。 谢谢

_global.NumberFormat = function(theNumber)
        
            var myArray:Array;
            var numberPart:String;
            var decPart:String;
            var result:String = '';
            var numString:String = theNumber.toString();

            if(theNumber.indexOf('.') > 0)
            
                myArray = theNumber.split('.');
                numberPart = myArray[0];
                decPart = myArray[1];
            
            else
            
                numberPart = numString;
            

            while (numString.length > 3)
            
                var chunk:String = numString.substr(-3);
                numString = numString.substr(0, numString.length - 3);
                result = ',' + chunk + result;
               
            if (numString.length > 0)
            
                    result = numString + result;
               

            if(theNumber.indexOf('.') > 0)
            
                result = result + '.' + decPart;
            


            //alert('Result: ' + result);

            return result;
        

【问题讨论】:

【参考方案1】:

试试这个,对我来说很好用:

var largeNumber:String=new String(1000000.999777);
var fAr:Array=largeNumber.split(".");
var reg:RegExp=/\d1,3(?=(\d3)+(?!\d))/;

while(reg.test(fAr[0]))
fAr[0]=fAr[0].replace(reg,"$&,");
var res:String=fAr.join(".");
trace(res);

跟踪:1,000,000.999777

【讨论】:

嗨 - 谢谢,但这甚至不能编译。你确定它符合 AS2 标准吗? RegExp 类在 AS2 中不可用,这仅限于 AS3。【参考方案2】:

你可以试试这个:

_global.NumberFormat = function(numString)

    numString = String(numString);
    var index:Number = numString.indexOf('.');
    var decimal:String;
    if(index > 0) 
        var splitByDecimal:Array = numString.split(".");
        //return NumberFormat(splitByDecimal[0])+"."+splitByDecimal[1];
        numString = splitByDecimal[0];
        decimal = splitByDecimal[1];
     else if(index === 0) 
        return "0"+numString;
    
    var result:String = '';
    while (numString.length > 3 ) 
        var chunk:String = numString.substr(-3);
        numString = numString.substr(0, numString.length - 3);
        result = ',' + chunk + result;
    
    result = numString + result;
    if(decimal) result = result + "." + decimal;
    return result;

如果存在,它会按小数分割数字(如果需要,补偿非法的 '.01234'),并使用递归,因此在分割元素上调用自身。

对于您的示例编号,此跟踪:

1,234
1,234.50
12,345.60
123,456.70
1,234,567.80

只是为了好玩

这就是您的原始代码不起作用的原因:

    创建数字的字符串表示形式 (var numString:String = theNumber.toString();) 后,您继续使用实际数字而不是字符串版本。 为数字部分赋值后,您继续对numString 而不是numberPart 执行操作。

修正后的版本如下所示:

_global.NumberFormat = function(theNumber)

    var myArray:Array;
    var numberPart:String;
    var decPart:String;
    var result:String = '';
    var numString:String = theNumber.toString();

    if(numString.indexOf('.') > 0)
    
        myArray = numString.split('.');
        numberPart = myArray[0];
        decPart = myArray[1];
    
    else
    
        numberPart = numString;
    

    while (numberPart.length > 3)
    
        var chunk:String = numberPart.substr(-3);
        numberPart = numberPart.substr(0, numberPart.length - 3);
        result = ',' + chunk + result;
       
    if (numberPart.length > 0)
    
        result = numberPart + result;
       

    if(numString.indexOf('.') > 0)
    
        result = result + '.' + decPart;
    


    //alert('Result: ' + result);

    return result;

【讨论】:

谢谢 - 不幸的是也没有编译。 它在 CS4/AS2/FP8 中运行良好。您能否提供更多有关您的设置以及您收到的编译错误的详细信息? @Cheeky - 我已经修改为使用您喜欢的声明样式。这还需要更改您可能错过的递归函数调用的名称。 谢谢 - 我已经尝试了一次又一次有错误。我正在运行一个使用 cfform 的 Coldfusion 9 页面,该页面使用 flash 并且可以使用 actionscript2 进行操作。因此,当出现编译错误时,除了不显示表单之外,我没有得到任何信息。我能够通过将它们注释掉来确定问题行:_global.NumberFormat = function (numString:String):String 必须是 _global.NumberFormat = function (numString) 否则无法编译。 return NumberFormat(splitByDecimal[0])+"."+splitByDecimal[1]; 行也出错了,大概是因为我必须按照我在上一条评论中详述的方式更改函数声明才能使函数正常工作。【参考方案3】:
public static function formatNumberString(value:Number,separator:String):String 
var result:String = "";
var digitsCount:Number = value.toString().length;

separator = separator || ",";

for (var i:Number = 0; i < digitsCount; i++) 
  if ((digitsCount - i) % 3 == 0 && i != 0) 
    result += separator;
  
    result += value.toString().charAt(i);
  
  return result;

【讨论】:

以上是关于逗号格式的数字的主要内容,如果未能解决你的问题,请参考以下文章

小数的 SQL 格式,用逗号表示小数,仅用于数字

根据区域设置的数字格式(逗号分隔)

PHP数字格式不带逗号

c ++:用逗号格式化数字?

用逗号格式化数字PHP [重复]

Highcharts:用逗号格式化所有数字?