如何使用复杂模式格式化 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);

请注意,此版本中额外的 forif 语句会使其运行速度比上面的慢,但除非您使用此处生成的值填充大表,否则这可能无关紧要很多。

【讨论】:

您的解决方案给我留下了深刻的印象,但我想要一个易于维护的代码。这些行是否排序?或者排序在这个解决方案中并不重要? 唯一重要的顺序是如何从号码中提取数字,即除以 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?

GWT 日志记录设置

GWT - css 类名

如何启动 GWT 超级开发模式 [重复]

是否可以将 GWT EntityProxy 与 RPC 调用一起使用?

您如何在不同的项目中将 JPA 对象与 GWT 一起使用?