【问题标题】:Counterintuitive result in NumberFormat of Intl Package in Dart/FlutterDart/Flutter 中 Intl 包的 NumberFormat 的反直觉结果
【发布时间】:2020-11-20 05:03:00
【问题描述】:

为什么NumberFormat(".##").format(17.46) 会导致字符串为 17.46 而不是 .46?

如何实现后者,即去掉小数点前的所有数字?

【问题讨论】:

  • 在调用format 之前,您是否尝试过将 NumberFormat 类的属性maximumIntegerDigits 更改为零?无论哪种方式,我都同意你的看法,这是一个违反直觉的结果。
  • @Naslausky maximumIntegerDigits 无法设置,尽管它们在 API 文档中。或者至少我还没有找到一个可行的例子。

标签: flutter dart number-formatting intl


【解决方案1】:

NumberFormat 只会改变数字的显示方式(基本上,格式是什么)。所以你不能得到数字的小数部分(它不像模式匹配那样工作)。 相反,您可以使用:

var num = 17.46;
var fraction = num.toString().split('.')[1];

注意:您可以使用'.' + num.toString().split('.')[1] 来获取带起始点的小数部分。

您可以在此link 中阅读有关NumberFormat 使用的ICU 格式的更多信息。

【讨论】:

  • 如果它只改变数字的显示方式,我看不出与我的问题有矛盾,因为它基本上与说:show me maxIntegeDigits=0 这是包裹。在我看来,我在这里得到的结果非常具有误导性。
【解决方案2】:

作为另一个答案的替代方案,您可以尝试在转换为字符串之前删除整数部分,而不是之后:

String formatFraction (num a){
  num b = a.floor();
  num c = a-b;
  return NumberFormat(".##").format(c);
}

这样你就可以保证不管语言环境它都能正常工作。

【讨论】:

  • 请注意,上面的代码可能无法满足负数的预期。如果您想从-17.46 中提取-0.46,请使用a.toInt() 而不是a.floor(),以便向零舍入而不是向负无穷大。
  • 此外,此解决方案在极少数情况下可能存在精度问题
【解决方案3】:

NumberFormat 类中的“#”标记单个数字(如果值为 0,则省略)。所以小数点后的标签数量表示你想要多少个小数位。例如:

double number = 12.1234;
NumberFormat(".#").format(number);     //prints 12.1
NumberFormat(".##").format(number);    //prints 12.12
NumberFormat(".###").format(number);   //prints 12.123
NumberFormat(".####").format(number);  //prints 12.1234

您可以使用 substring 和 indexOf 删除小数点之前的所有内容,如下所示:

String str = "12.36";
String newStr = str.substring(str.indexOf('.') + 1);
//If you want to include the decimal point, remove the + 1.

【讨论】:

  • 这如何回答"Why does NumberFormat(".##").format(17.46) leads to a string of 17.46 and not .46?" 的问题?如果你甚至使用 0 代替 #,它仍然不起作用。
  • @HBS 您的修复有效,但是它不能解释 NumberFormat 方法的行为。
  • @Heikkisorsa 添加了一些示例。希望现在有意义。
  • @HBS 谢谢你的例子。但是,在我看来,这种行为仍然违反直觉,API Docs 关于可以为格式设置的属性是不正确的。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2021-08-20
  • 1970-01-01
  • 2019-05-14
  • 2022-11-30
  • 1970-01-01
  • 2018-07-28
  • 2018-06-16
相关资源
最近更新 更多