格式化数字字符串[关闭]

Posted

技术标签:

【中文标题】格式化数字字符串[关闭]【英文标题】:Format a number string [closed] 【发布时间】:2013-04-22 13:43:11 【问题描述】:

我有一个号码String,比如"1234567890"

我需要将此String 格式化为"1234 5678 90"。 (空格是空格字符) 有人可以告诉我如何在java中做到这一点吗?

谢谢

【问题讨论】:

你应该写一个程序:) 我认为存在大量混乱以及为什么他得到-1。他要求的不是基本的字符串操作,而是数字格式,这在 Java 中是一件复杂的事情(参见 Baadshah 的回答)。尽管他本可以在谷歌上搜索这个问题,但它已经被问了无数次了。 @AdamGent 好的,我也喜欢这个答案,但是来吧......如果你卡在某个地方,你可以问 ***。如果您有解决方案并且需要更好的解决方案,请咨询 ***。如果您甚至没有开始考虑问题,就不会。 @CsBalazsHungary 是的,它变得荒谬了。我最喜欢的是人们在没有给出任何基准数字或代码的情况下询问为什么某些东西很慢。常见问题解答应该是教别人如何使用 Google :) @Sen 看起来像一个电话号码。如果是你应该看看谷歌的电话号码库:code.google.com/p/libphonenumber 【参考方案1】:

假设您的字符串长度相同:

String s1 = "1234567890";
String s2 = s1.substring(0, 3) + " " + s1.substring(4, 7) + " " + s1.substring(8, 9);

【讨论】:

非常慢!!每次调用时,子字符串都会从头开始解析字符串。 @javadev 与什么相比非常慢? 无可比拟。该解决方案工作正常,但是:1)如果你有一个更大的数字将无法工作,2)如果它是一个巨大的数字会很慢。 @javadev 例如,如果子字符串从索引 0 到索引 3,它只会读取中间的那些字符。 @javadev 十进制格式要贵得多。【参考方案2】:

基于正则表达式的版本

     String s = "1234567890";
     s = s.replaceAll("(\\d+)(\\d2)", "$1 $2");
     while(s.matches("\\d+\\d4 \\d+")) 
         s = s.replaceAll("(\\d+)(\\d4 \\d+)", "$1 $2");
     
     System.out.println(s);

输出

1234 5678 90

【讨论】:

【参考方案3】:

您可以使用StringBuilder 来提高性能:

StringBuilder builder = new StringBuilder("1234567890");
builder.insert(4, ' ').insert(9, ' ');
String formattedString = builder.toString();

给你

1234 5678 90

【讨论】:

【参考方案4】:
   StringBuilder sb= new StringBuilder("1234567890");
   sb.insert(4, ' ').insert(9, ' ');
   String output= sb.toString();

【讨论】:

什么是 phoneNumberSymbols? 你读过 DecimalFormat 的文档吗?你试过你的代码吗? +1 的想法虽然 myformat.format 几乎不工作 @Baadshah 你真的运行这个来查看结果吗? 您的解决方案无法正常工作。见ideone.com/jVwvaQ。我不知道为什么人们投票只是因为它看起来很漂亮【参考方案5】:

使用java.text.MessageFormat 试试这个。

public static void main(String[] args) 
    String phoneRawString = "1234567890";

    java.text.MessageFormat phoneMsgFmt = new java.text.MessageFormat(
            "0 1 2");
    // suposing a grouping of 4-4-2
    String[] phoneNumArr =  phoneRawString.substring(0, 4),
            phoneRawString.substring(4, 8), phoneRawString.substring(8) ;

    System.out.println(phoneMsgFmt.format(phoneNumArr));

输出:

1234 5678 90

使用正则表达式的另一种方式:

long phoneNum = 1234567890L;
String result = String.valueOf(phoneNum).replaceFirst("(\\d4)(\\d4)(\\d+)", "$1 $2 $3");
System.out.println(result);

【讨论】:

SubString 方法会有点慢。 @Sen 查看另一种使用正则表达式的方法。【参考方案6】:
    String input = "1234567890";
    Formatter f = new Formatter(new StringBuilder(), Locale.UK);
    String res = f.format("%s%5s%3s", input.substring(0, 4), input.substring(4, 8), input.substring(8, 10)).toString();
    System.out.println(res);

【讨论】:

以上是关于格式化数字字符串[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java从字符串中获取数字或货币格式[关闭]

需要单个数字(日和月)的唯一日期格式化程序[关闭]

这种数字格式有啥问题? [关闭]

在货币格式文本中的数字和字母之间插入空格[关闭]

在 T-SQL CASE 语句的 WHEN 条件中设置变量等于数字时语法不正确[关闭]

Javascript:格式化数字的更简单方法? [关闭]