如何使用复杂模式格式化 GWT 中的数字?例如:“000-000-000/000”
Posted
技术标签:
【中文标题】如何使用复杂模式格式化 GWT 中的数字?例如:“000-000-000/000”【英文标题】:How to format a number in GWT with a complex pattern? Ex.: "000-000-000/000" 【发布时间】:2014-05-23 19:55:03 【问题描述】:在GWT NumberFormat documentation 中,解释了如何格式化数字。
如何在客户端格式化数字,如下所示:"000-000.000.000/000"
?
这是一个文档编号,我需要在需要的地方用零填充,以适应固定大小。
GWT 将点和逗号理解为小数和货币分隔符。我还没有在文档中找到如何使用复杂模式进行格式化。
在创建解决此问题的服务器端方法之前,我想看看是否有人知道使用 GWT 的客户端解决方案。
【问题讨论】:
看看这个thread可能会有所帮助 这个线程NumberFormat and German Locale 可能会对@Thomas Broyer 提出的问题有所帮助 @Braj 表示文档编号。必须用零填充以适应长度。 【参考方案1】:一种不太优雅(但可能是最快)的方法是自己动手:
定义所需总长度的char[]
设置不变的字符
用简单的模数和除法运算填写数字
将char[]
转换为String
例如:
public static String format(long num)
char[] result = new char[19];
result[ 3] = '-';
result[ 7] = '.';
result[11] = '.';
result[15] = '/';
result[18] = (char) (num % 10 + 48); num /= 10;
result[17] = (char) (num % 10 + 48); num /= 10;
result[16] = (char) (num % 10 + 48); num /= 10;
result[14] = (char) (num % 10 + 48); num /= 10;
result[13] = (char) (num % 10 + 48); num /= 10;
result[12] = (char) (num % 10 + 48); num /= 10;
result[10] = (char) (num % 10 + 48); num /= 10;
result[ 9] = (char) (num % 10 + 48); num /= 10;
result[ 8] = (char) (num % 10 + 48); num /= 10;
result[ 6] = (char) (num % 10 + 48); num /= 10;
result[ 5] = (char) (num % 10 + 48); num /= 10;
result[ 4] = (char) (num % 10 + 48); num /= 10;
result[ 2] = (char) (num % 10 + 48); num /= 10;
result[ 1] = (char) (num % 10 + 48); num /= 10;
result[ 0] = (char) (num % 10 + 48);
return new String(result);
基本上num % 10
返回数字中的最后一位,+ 48
将其转换为对应Ascii字符的数字,(char)
实际上将其转换为字符。 num /= 10
(与num = num / 10
相同)然后移动到下一位。这样,文本从后到前构建,从最低有效位开始。
以下调用:
System.out.println(format( 12345L));
System.out.println(format(123456789024680L));
然后会输出:
000-000.000.012/345
123-456.789.024/680
(由于我不知道您的数字中的 0 应该对应于哪些数字,以及您是在谈论整数还是在某处有小数点的数字(通常应该只有一个),所以这个例子只是简单地把long
的 15 个最低位代替你的 0。但是应该直接调整这个代码来做你需要的事情。要让它显示一个小数,只需乘以 10 的某个幂来移动最后一个你想显示到“单位位置”的数字,例如,如果你想在小数点后有 3 位,乘以 1000,所以调用函数为 format((long) (number * 1000))
其中number
是你的浮点值。)
更新:
这是代码的缩短和记录版本,大多数人可能会认为它更易于维护:;)
public static String format(long num)
// Create array of characters to hold result
char[] result = new char[19];
// Set all characters in array to (char) 0 (not the same as '0'!)
Arrays.fill(result, (char) 0);
// Fill in constant symbols
result[ 3] = '-';
result[ 7] = '.';
result[11] = '.';
result[15] = '/';
// Run backwards through digits in number
for (int i=result.length-1; i>=0; i--)
// Only fill places in result array without constant symbols
if (result[i]==0)
// Place digit in result array
result[i] = (char) (num % 10 + 48);
// Advance to next digit
num /= 10;
// Convert result array to String and return
return new String(result);
请注意,此版本中额外的 for
和 if
语句会使其运行速度比上面的慢,但除非您使用此处生成的值填充大表,否则这可能无关紧要很多。
【讨论】:
您的解决方案给我留下了深刻的印象,但我想要一个易于维护的代码。这些行是否排序?或者排序在这个解决方案中并不重要? 唯一重要的顺序是如何从号码中提取数字,即除以 10。因此,以result[18]
到 result[0]
开头的行需要按该顺序排列。但是您可以轻松地将其他行 (result[3, 7, 11, and 15]
) 放置在序列中的“正确”位置上,将 -
、.
和 /
有些人可能还认为将所有这些从数字中提取数字的行放入for
-loop 中更容易维护。让我更新一下我的答案。
@EdPichler 关于性能的另一条评论:javascript 本身不支持数字类型long
,因此 GWT 实际上使用两个数字来模拟它,这有点慢。如果您需要此函数快速运行,请在第一行使用double
而不是long
(此处无需更改其他内容,但也许您还想在其余部分更改它代码(如果可能)并使用非循环版本。 :)
感谢您的建议,我开始使用 GWT 并享受很多。【参考方案2】:
不确定这是否适用于您,但这是我们格式化电话号码的解决方案。格式是(### ###-####),这里输入的字符串可以是任何东西...
String digits = textValue.replaceAll("\\D+", "");
if (digits.length()>10)
digits = digits.substring(0,10);
if (digits.length() == 10)
setText(digits.substring(0, 3) + " " + digits.substring(3, 6) + "-" + digits.substring(6, 10));
else
// diplay an error message
【讨论】:
以上是关于如何使用复杂模式格式化 GWT 中的数字?例如:“000-000-000/000”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 GWT-RPC 以外的方式访问 GWT servlet?