在GWT NumberFormat documentation中,解释了如何格式化数字。
如何在客户端格式化数字,如下所示:"000-000.000.000/000"
?
它是一个文档编号,我需要在需要的地方填写零,以适应固定的大小。
GWT将点和逗号理解为十进制和货币分隔符。我还没有在文档中找到如何使用复杂模式进行格式化。
在创建解决此问题的服务器端方法之前,我想看看是否有人知道使用GWT的客户端解决方案。
答案 0 :(得分:2)
一个不太优雅(但可能是最快)的方法就是自己动手:
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相对应,以及你是在谈论整数还是某个小数点(通常应该只有一个),这个例子只是简单地说{0}中long
的15个最低位数。但是应该直接调整此代码以执行您需要的操作。要显示小数,只需乘以10的幂来移动要显示在"单元位置"的最后一位数字,例如,如果您想在小数点后有3位数,则乘以1000,因此将函数称为format((long) (number * 1000))
其中{{1}是你的浮点值。)
<强>更新强>
这是一个缩短并记录在案的代码版本,大多数人可能会考虑更易于维护:;)
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
语句将使其运行速度低于上述语句,但除非您使用此处生成的值填充大型表,否则可能并不重要。
答案 1 :(得分:0)
不确定这是否适用于您,但这是我们格式化电话号码的解决方案。格式为(### ### - ####),此处的输入字符串可以是任何内容......
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
}