1

我有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.

4

2 回答 2

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  ")));
于 2013-08-28T14:58:34.693 回答
1

假设在每个 10^3 数字组之间没有用逗号返回您的数字(即 1,000,000 代表 100 万),您可以只在逗号上使用替换。

Number("23,5".replace(",","."); // output Number( "23.5" ) = 23.5

这将用句点替换数字中的所有逗号,并且系统应将其读取为正常数字。

于 2013-08-28T20:06:41.903 回答