Форматирование числа через запятую

#actionscript #actionscript-2

#actionscript #actionscript-2

Вопрос:

Мне нужно форматировать числа с помощью запятых как разделители тысяч, например:

 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

Это для Actionscript 2 в приложении Coldfusion / Flash, поэтому используется обычный 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   resu<
            }   
            if (numString.length > 0)
            {
                    result = numString   resu<
            }   

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


            //alert('Result: '   result);

            return resu<
        }
  

Ответ №1:

Вы могли бы попробовать это:

 _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   resu<
    }
    result = numString   resu<
    if(decimal) result = result   "."   decimal;
    return resu<
}
  

Он разбивает число на десятичное число, если оно присутствует (компенсируя недопустимое ‘.01234’, если требуется), и использует рекурсию, поэтому вызывает себя для разделяемого элемента.

Для вашего примера numbers это отслеживает:

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

Просто для удовольствия

Вот почему ваш исходный код не работал:

  1. После создания строкового представления числа ( var numString:String = theNumber.toString(); ) вы продолжали использовать фактическое число, а не строковую версию.
  2. После присвоения значения числовой части вы продолжили выполнять операции над 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   resu<
    }   
    if (numberPart.length > 0)
    {
        result = numberPart   resu<
    }   

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


    //alert('Result: '   result);

    return resu<
}
  

Комментарии:

1. Спасибо — к сожалению, это тоже не компилируется.

2. У меня это нормально работает в CS4 / AS2 / FP8. Можете ли вы предоставить более подробную информацию о вашей настройке и о том, какую ошибку компиляции вы получаете?

3. @Cheeky — я внес изменения, чтобы использовать ваш предпочтительный стиль объявления. Это также потребовало изменения имени рекурсивного вызова функции, которое вы, возможно, пропустили.

4. Спасибо — я пробовал снова и снова возникают ошибки. Я запускаю страницу Coldfusion 9, которая использует cfform, использующую flash, и которой можно управлять с помощью actionscript2. Поэтому я не получаю никакой информации при возникновении ошибки компиляции, кроме того, что она просто не отображает форму. Что я смог определить, так это проблемные строки, закомментировав их: _global.NumberFormat = function (numString:String):String должно быть _global.NumberFormat = function (numString) , иначе оно не компилируется.

5. Также строка return NumberFormat(splitByDecimal[0]) "." splitByDecimal[1]; содержит ошибку, предположительно потому, что мне пришлось изменить объявление функции так, как я описал в своем последнем комментарии, чтобы заставить функцию работать.

Ответ №2:

 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 amp;amp; i != 0) {
    result  = separator;
  }
    result  = value.toString().charAt(i);
  }
  return resu<
}
  

Ответ №3:

Попробуйте это, у меня все работает нормально:

 var largeNumber:String=new String(1000000.999777);
var fAr:Array=largeNumber.split(".");
var reg:RegExp=/d{1,3}(?=(d{3}) (?!d))/;

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

Трассировка: 1,000,000.999777

Комментарии:

1. Привет — спасибо, но это даже не компилируется. Вы уверены, что это совместимо с AS2?

2. Класс RegExp недоступен в AS2, это только AS3.