我有TextInput
,需要返回Number
。
我的问题是输入的值已本地化为登录用户并影响小数点分隔符。
当我尝试从波兰用户那里获得一个号码时,我似乎总是得到一个NaN
,但它对英语用户来说很有用:
输入示例: 英语:23.5 波兰语:23,5
有解决方法吗?我有以下不起作用:
public function get myValue():Number {
var value:Number = new Number(StringUtil.trim(text)); //NaN with Polish
return value;
}
我也尝试了以下内容,但它也提供了NaN
:
private function myValue(number:Number, precision:Number=2):Number{
var numberFormatter:NumberFormatter = getNumberFormatter(precision);
return new Number(numberFormatter.formatNumber(number));
}
private function getNumberFormatter(precision:Number=2):NumberFormatter{
var iso:String = ClientInfo.instance.language.ISOCode;
var formattedIso:String = iso.substr(0, 2)+'_'+iso.substr(2,2);
var numberFormatter:NumberFormatter = new NumberFormatter(formattedIso);
numberFormatter.fractionalDigits = precision;
numberFormatter.trailingZeros = true;
return numberFormatter;
}
当我调试代码时,我可以看到NumberFormatter
正常工作,但始终调用new Number("23,5")
提供NaN
。
答案 0 :(得分:1)
现在无法测试,但我想它应该可行:
public function get myValue():Number
{
var value:Number = getNumberFormatter.parseNumber(StringUtil.trim(text));
return value;
}
我认为关键是,你应该使用parseNumber()!
<强> [更新] 强> 这是一个FlexUnit测试,以便更好地理解:
[Test]
public function test(): void
{
var number: Number = new NumberFormatter("de-DE").parseNumber("23,5");
assertEquals(23.5, number);
number = new NumberFormatter("en-US").parseNumber("23.5");
assertEquals(23.5, number);
number = new NumberFormatter("de-DE").parseNumber("1.023,456");
assertEquals(1023.456, number);
number = new NumberFormatter("pl-PL").parseNumber("1023,45");
assertEquals(1023.45, number);
number = new NumberFormatter("pl-PL").parseNumber("1.023,45");
assertTrue(isNaN(number));
number = new NumberFormatter("pl-PL").parseNumber("1 023,45");
assertEquals(1023.45, number);
number = new NumberFormatter("pl-PL").parseNumber(" 10 531 023,45 ");
assertEquals(10531023.45, number);
}
正如您所见,NumberFormatter
正确处理十进制和千位分隔符。
如果要将其格式化,那么您可以像这样使用它:
var numFmt: NumberFormatter = new NumberFormatter("pl-PL");
assertEquals("23,50", numFmt.formatNumber(numFmt.parseNumber(" 23,5 ")));
numFmt.fractionalDigits = 1;
assertEquals("23,6", numFmt.formatNumber(numFmt.parseNumber(" 23,57 ")));
答案 1 :(得分:1)
假设您的号码没有在每个10 ^ 3号码组之间以逗号返回(即1,000,000为100万),您可以在逗号上使用替换。
Number("23,5".replace(",","."); // output Number( "23.5" ) = 23.5
这将用句点替换数字中的所有逗号,系统应将其读作普通数字。