【问题标题】:Get a Number from String with no default decimal separator从没有默认小数分隔符的字符串中获取数字
【发布时间】:2013-08-28 14:30:44
【问题描述】:

我有一个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

【问题讨论】:

    标签: apache-flex localization numbers decimal flex4.5


    【解决方案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  ")));
    

    【讨论】:

    • parseNumber 只返回字符串,所以我不相信这会起作用。我尝试将它与新的 Number(..parseNumber(text)) 一起使用,但它仍然给出 NaN
    • @Marthin parseNumber() 根据定义返回 Number!
    • 你是对的。在我的 IDE 中,它说返回类型为 String,但它是错误的 =)。谢谢帮助
    • 这一切都很好,它解决了我的问题,但不是我的问题,因为最后我需要一些可以处理 assert(23,5, number) 的东西,其中 number 是 new NumberFormatter("pl-PL ").parseNumber("23,5");我的验证器需要这个
    • @Marthin 对不起,我不明白你的问题。这应该肯定有效:assertEquals(23.5, new NumberFormatter("pl-PL").parseNumber("23,5"));
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2017-05-02
      • 2013-05-29
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多