gpt4 book ai didi

Android Java.Lang Locale Number Format I/O 不对称问题

转载 作者:行者123 更新时间:2023-11-30 04:54:54 25 4
gpt4 key购买 nike

过去,在南非销售的 Android 手机提供 English.US 和 English.UK 语言环境支持,但最近 English.ZA(南非)出现了,例如在 Android 9.0 三星 Galaxy A10 上。

这个特定的 Locale 显示数字格式的不对称处理,在将 Floats 和 Doubles 转换为字符串时使用 Locale.DE(德语/荷兰语)约定 [*1],但在回读自身时引发 Java.Lang.NumberFormatException - 相同的生成字符串。例如:

// on output
Float fltNum = 1.23456F;
System.out.println(String.format(Locale.getDefault(),"%f",fltNum)); // prints '1,23456'
// on Input
String fltStr = "1,23456";
Float fltVal;
fltVal = Float(fltStr); // generates NumberFormatException
fltVal = Float.parseFloat(fltStr); // also generates NumberFormatException
// Giving the compiler Float hints fltStr = "1,23456F" does not help
// Only fltStr = '1.23456' converts into a Float.

在读取时很想交换小数点分隔符,但这是 Float.parseFloat() 的任务,而不是程序员的任务,因为这样做会再次破坏其他 Locale.DE-likes,例如 Locale.ID (印度尼西亚)我的应用程序支持。

我更多针对区域设置仲裁员的附加问题是:English.ZA 是否暗示 German.NA(纳米比亚)符合德语?人们会认为这个特定数字转换的自然名称是 Dutch.ZA(通俗地称为“南非荷兰语”),以符合荷兰语,但 Android 将其指定为 English.ZA?

注意(*1)此 Android English.ZA 仅部分符合,因为它不生成德语点组分隔符或本地文书(笔和纸)空格字符组分隔符。

最佳答案

对于使用“回答”来回应 diogenesgg 的评论建议表示歉意:

"Hi, please take a look at this answer stackoverflow.com/questions/5233012/…. TL/DR."

我在其中发现了一些 gem -(1)

NumberFormat f = NumberFormat.getInstance(Locale.getDefault());
if (f instanceof DecimalFormat) {
((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);
}

但这是中性的而不是特定于值(value)的,所以我在上面添加了,

(2) 给定:

String axisValue("some-float-value-rendered as string");
NumberFormat nf = new DecimalFormat(axisValue);

我按顺序合并:

NumberFormat nf = new DecimalFormat(axisValue);
Number n;
if(nf instanceof DecimalFormat){
try{
n = nf.parse (axisValue);
axisComponent = (Double) n;
} catch (java.text.ParseException jtpe) {
jtpe.printStackTrace();
}
}

注意需要将 Number n 转换为 Double。

这主要在有问题的 Locale English.ZA 下有效,直到出现值 0,00000。

对于字符串值“0,00000”,NumberFormat 判断 Number n 是一个 Long,系统抛出一个(Long to Double)CastException。

我试图以各种方式欺骗 NumberFormat,我可以将 0 视为 Float 或 Double 无济于事,因此 0 是 Number (NumberFormat.DecimalFormat) 不能容忍的边界问题。

但是这个 NumberFormat 解决方法并没有解决 Android 9 Locale.English(ZA).DecimalFormat 发出 Locale.DE(逗号小数点分隔符)但仅解析 System.Primitives(小数点分隔符)的不对称问题。

顺便说一句,越过 DecimalFormat 问题暴露了这个新奇的 English.ZA 下的无数其他问题,我的应用程序假设系统原语与 native 资源同样工作良好。如此使用的良好语义需要字符串比较才能在原始和 native 之间工作!

例如,系统文件原始路径名在 Native 中呈现生成“找不到文件”,或者甚至更多问题,仅在语义上使用原始字符串键在 Native 查找中呈现无意义。

我不确定哪个是较小的邪恶、不对称的语言环境 English.ZA 或我在语义中使用 Primitives 来强加给 Natives。徒劳的练习!

现在我正着手分离系统基元,包括它们与任何本地语言资源字符串的语义变体......

我在系统原语下编程的一生需要全面改造。

也许我可以为基元(资源或语义)保留一个 Assets 存储库,并让 Natives 查找系统资源或语义含义。

关于Android Java.Lang Locale Number Format I/O 不对称问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59419425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com