#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
Просто для удовольствия
Вот почему ваш исходный код не работал:
- После создания строкового представления числа (
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 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.