如何使用复杂模式格式化GWT中的数字?例:“000-000-000 / 000”

时间:2014-05-23 19:55:03

标签: gwt

GWT NumberFormat documentation中,解释了如何格式化数字。

如何在客户端格式化数字,如下所示:"000-000.000.000/000"

它是一个文档编号,我需要在需要的地方填写零,以适应固定的大小。

GWT将点和逗号理解为十进制和货币分隔符。我还没有在文档中找到如何使用复杂模式进行格式化。

在创建解决此问题的服务器端方法之前,我想看看是否有人知道使用GWT的客户端解决方案。

2 个答案:

答案 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
}