특정 위치에서 문자열에 문자를 삽입하는 방법은 무엇입니까?


155

나는에 받고 있어요 int6 자리 값. String의 끝에서 2 자리의 소수점 (.) 으로 표시하고 싶습니다 int. 나는를 사용하고 싶어 float하지만 사용하도록 제안되었다 String(대신 더 나은 디스플레이 출력 1234.5될 것입니다 1234.50). 따라서 int매개 변수로 매개 변수 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

답변:


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

6
문자열은 변경할 수 없습니다. 이것이 작동하는 동안 StringBuilder와 같은 것을 사용하는 것은 도덕적으로 정확하지만 언급하지 않으면 코드가 더 빨라집니다.
wheresmycookie

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이됩니다. 항상 마지막 2 자리가 소수점 뒤에 x = x.substring(0, x.length()-2) + "." + x.substring(x.length()-2);
오도록

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

17
int yourInteger = 123450;
String s = String.format("%6.2f", yourInteger / 100.0);
System.out.println(s);

java.math.BigDecimal사용 double하면 반올림 오류 가 발생할 수 있으므로 사용 하는 것이 좋습니다 . 정밀도보다 속도가 더 중요하다면 double더 좋습니다.
sotrh

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));

의견에 따르면, float 대신 double을 사용하는 것처럼 12345 / 100.0이 더 좋습니다.


2
double더 나은 선택 일 수 있습니다. float는 6 자리까지만 정확합니다.
Peter Lawrey

1
예, 누군가가 응답 한 또 다른 예는 12345 / 100.0을 사용하는 것이 더 똑똑합니다 (결국 같은 결과가
나오

Nitpicking : 12345/100 = 123은 정수이고 나중에 123.00으로 만 캐스팅되기 때문에 이것이 올바른 결과를 제공하지 않는다고 생각합니다. ((float) 12345/100) 작동합니다.
rurouni

Heh, 좋은 지적-우선 순위를 고려하지 않았습니다. 주로 처음 실행했을 때 잘린 결과를 얻었 기 때문입니다. 게시물을 수정합니다 (12345/100이라고 말한 다음 먼저 값을 넓히는 대신 결과를 캐스트합니다)
Joseph Ottinger

0

float가 비싸거나 (예 : 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을 사용하는 것이 좋습니다.
Joseph Ottinger

@Joseph : 당신 말이 맞아요. 나는 회계에 있지 않고 주로 성능상의 이유로 고정 소수점 표현으로 int를 사용하므로 (내장 자바에서) BigDecimal은 내 선택이 아닙니다. ;-)
rurouni

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 dudes;)의 답변에서 (@ 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
스택 오버플로에 오신 것을 환영합니다! 일반적으로 코드의 목적과 다른 언어를 도입하지 않고 문제를 해결하는 이유에 대한 설명이 포함되어 있으면 답변이 훨씬 유용합니다. 답변의 참조 값을 개선하고 더 이해하기 쉽게 해주셔서 감사합니다!
Tim Diekmann

2004 년에 StringBuilder로 대체 된 StringBuffer를 사용하지 마십시오.
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;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.