如何在某个位置的字符串中插入字符?


155

我输入的是int6位数的值。我想将其显示为String从末尾起2位数的小数点(。)int。我想用float,但建议使用String一个更好的显示输出(而不是1234.51234.50)。因此,我需要一个函数,该函数将intas作为参数,并String从末尾返回2位数的小数点格式正确。

说:

int j= 123456 
Integer.toString(j); 

//processing...

//output : 1234.56

1
String str = Integer.toString(j); //integer or string with white spaces<br/> str = new StringBuffer(str.trim()).insert(str.length()-2, ".").toString();
user881703

Answers:


195
int j = 123456;
String x = Integer.toString(j);
x = x.substring(0, 4) + "." + x.substring(4, x.length());

6
字符串是不可变的。尽管这可行,但使用StringBuilder之类的东西在道德上是正确的,更不用说会使您的代码更快。
wheresmycookie 2013年

7
忘记StringBuilder。使用这种格式,String.format是最好的选择。
NobleUplift

33
没有循环,这是一个简单的串联情况,编译器应使用字符串生成器对其进行优化,出于可读性考虑,我更喜欢使用+运算符,在这种情况下无需显式使用StringBuilder。使用“ StringBuilder”解决方案因为它更快,所以不遵守优化规则。可读性代码。分析后,仅在需要时进行优化。 en.wikipedia.org/wiki/Program_optimization#Quotes
Remi Morin

17
您在第二个子字符串调用中不需要x.length()。
crazyGuy

1
当数字是不同的数字时,此解决方案将失败。对于12345,它将输出1234.5,对于1234567,它将输出1234.567。如果您始终希望最后两位数在小数点后,请确保该数字至少有3位,然后再执行x = x.substring(0, x.length()-2) + "." + x.substring(x.length()-2);
Teodor Marinescu

210

如评论中所述,StringBuilder可能比使用StringBuffer更快。如Java文档中所述:

此类提供与StringBuffer兼容的API,但不保证同步。此类设计为在单线程正在使用字符串缓冲区的地方(通常是这种情况)来代替StringBuffer。在可能的情况下,建议优先使用此类而不是StringBuffer,因为在大多数实现中它会更快。

用法:

String str = Integer.toString(j);
str = new StringBuilder(str).insert(str.length()-2, ".").toString();

或者,如果您需要同步,请使用具有类似用法的StringBuffer

String str = Integer.toString(j);
str = new StringBuffer(str).insert(str.length()-2, ".").toString();

1
此解决方案适用于任何> = 4个字符的字符串:字符串“ 111”给我“ .111”,任何小于该值的结果都为java.lang.StringIndexOutOfBoundsException(试图访问不存在的引用)。
sotrh 2014年


5

在大多数用例中,使用StringBuilder(已回答)是一种很好的方法。但是,如果性能很重要,这可能是一个不错的选择。

/**
 * Insert the 'insert' String at the index 'position' into the 'target' String.
 * 
 * ````
 * insertAt("AC", 0, "") -> "AC"
 * insertAt("AC", 1, "xxx") -> "AxxxC"
 * insertAt("AB", 2, "C") -> "ABC
 * ````
 */
public static String insertAt(final String target, final int position, final String insert) {
    final int targetLen = target.length();
    if (position < 0 || position > targetLen) {
        throw new IllegalArgumentException("position=" + position);
    }
    if (insert.isEmpty()) {
        return target;
    }
    if (position == 0) {
        return insert.concat(target);
    } else if (position == targetLen) {
        return target.concat(insert);
    }
    final int insertLen = insert.length();
    final char[] buffer = new char[targetLen + insertLen];
    target.getChars(0, position, buffer, 0);
    insert.getChars(0, insertLen, buffer, position);
    target.getChars(position, targetLen, buffer, position + insertLen);
    return new String(buffer);
}

4

使用ApacheCommons3 StringUtils,您还可以

int j = 123456;
String s = Integer.toString(j);
int pos = s.length()-2;

s = StringUtils.overlay(s,".", pos, pos);

它基本上是子字符串连接,但是如果您不介意使用库,或者已经依赖StringUtils,则可以缩短


2

你可以用

System.out.printf("%4.2f%n", ((float)12345)/100));

根据评论,12345 / 100.0会更好,使用double而不是float会更好。


2
double可能是一个更好的选择。float仅精确到6位数字。
彼得Lawrey

1
是啊,再比如有人回应,是使用12345 / 100.0,这是聪明的(尽管它具有相同的结果结束了。)
约瑟夫·奥廷格

剔除:我认为这不会给出正确的结果,因为12345/100 = 123(整数),然后仅转换为123.00。((float)12345/100)将起作用。
rurouni 2011年

嘿,好点-我并没有考虑优先顺序,主要是因为他第一次运行它会给他截短的结果。将修复该帖子(以前说12345/100,然后强制转换结果,而不是先扩大该值。)
Joseph Ottinger

0

如果您使用的系统中浮动价格昂贵(例如,没有FPU)或不允许使用(例如,在财务方面),则可以使用以下方法:

    for (int i = 1; i < 100000; i *= 2) {
        String s = "00" + i;
        System.out.println(s.substring(Math.min(2, s.length() - 2), s.length() - 2) + "." + s.substring(s.length() - 2));
    }

否则,DecimalFormat是更好的解决方案。(上面的StringBuilder变体不适用于小数(<100)


2
如果是会计,BigDecimal会更好。
约瑟夫·奥丁格

@约瑟夫:你是对的。我不从事会计工作,出于性能原因(在嵌入式Java中),我大多将ints用作定点表示形式,因此BigDecimal不是我的选择;-)
rurouni 2011年

0

我认为,将这种字符串插入某个位置的一种更简单,更优雅的解决方案是:

target.replaceAll("^(.{" + position + "})", "$1" + insert);

例如,要:在时间字符串中插入缺失值:

"-0300".replaceAll("^(.{3})", "$1:");

它的作用是匹配position字符串开头的字符,对其进行分组,并用其自身($1)替换该组,后跟insert字符串。请注意replaceAll,即使总是发生一次,因为第一个参数必须是正则表达式。

当然,它不具有与StringBuilder解决方案相同的性能,但是我认为简洁和易于阅读的单行代码(与庞大的方法相比)简洁明了足以使它成为大多数非性能中的首选解决方案关键用例。

请注意,出于文档原因,我正在解决标题中的一般性问题,当然,如果要处理十进制数字,则应使用已经提出的针对特定领域的解决方案。


0

String.format(“%0d。%02d”,d / 100,d%100);


对于对此表示反对的人:重新阅读OP的详细说明。这为问题提供了准确的答案:无浮点数学。将小数点放在正确的位置。也就是说,stackoverflow.com / a / 5884413/972128提供了类似的答案,但使用浮点数(不希望使用),并且此时有17个投票。
kkurian

0

对于Kotlin帅哥;)从公认的答案中(@ MikeThomsen's)

fun String.insert(index: Int, string: String): String {
    return this.substring(0, index) + string + this.substring(index, this.length)
}

测试✅

"ThisTest".insert(4, "Is").should.equal("ThisIsTest")

-2
  public static void main(String[] args) {
    char ch='m';
    String str="Hello",k=String.valueOf(ch),b,c;

    System.out.println(str);

    int index=3;
    b=str.substring(0,index-1 );
    c=str.substring(index-1,str.length());
    str=b+k+c;
}

-2
// Create given String and make with size 30
String str = "Hello How Are You";

// Creating StringBuffer Object for right padding
StringBuffer stringBufferRightPad = new StringBuffer(str);
while (stringBufferRightPad.length() < 30) {
    stringBufferRightPad.insert(stringBufferRightPad.length(), "*");
}

System.out.println("after Left padding : " + stringBufferRightPad);
System.out.println("after Left padding : " + stringBufferRightPad.toString());

// Creating StringBuffer Object for right padding
StringBuffer stringBufferLeftPad = new StringBuffer(str);
while (stringBufferLeftPad.length() < 30) {
    stringBufferLeftPad.insert(0, "*");
}
System.out.println("after Left padding : " + stringBufferLeftPad);
System.out.println("after Left padding : " + stringBufferLeftPad.toString());

2
欢迎使用Stack Overflow!通常,如果答案包括对代码意图的解释,以及为什么不引入其他代码就能解决问题的原因,则答案会更有帮助。感谢您提高答案的参考价值并使其更易于理解!
蒂姆·迪克曼

请不要使用StringBuffer,因为它在2004
。– Peter Lawrey

-2

试试这个 :

public String ConvertMessage(String content_sendout){

        //use unicode (004E00650077) need to change to hex (&#x004E&#x;0065&#x;0077;) first ;
        String resultcontent_sendout = "";
        int i = 4;
        int lengthwelcomemsg = content_sendout.length()/i;
        for(int nadd=0;nadd<lengthwelcomemsg;nadd++){
            if(nadd == 0){
                resultcontent_sendout = "&#x"+content_sendout.substring(nadd*i, (nadd*i)+i) + ";&#x";
            }else if(nadd == lengthwelcomemsg-1){
                resultcontent_sendout += content_sendout.substring(nadd*i, (nadd*i)+i) + ";";
            }else{
                resultcontent_sendout += content_sendout.substring(nadd*i, (nadd*i)+i) + ";&#x";
            }
        }
        return resultcontent_sendout;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.