web-dev-qa-db-de.com

Einfügen eines Zeichens in eine Zeichenfolge an einer bestimmten Position

Ich bekomme einen int mit einem 6-stelligen Wert. Ich möchte es als String mit einem Dezimalpunkt (.) Mit zwei Ziffern vom Ende von int anzeigen. Ich wollte eine float verwenden, es wurde jedoch vorgeschlagen, String für eine bessere Anzeige zu verwenden (statt 1234.5 wird 1234.50). Daher brauche ich eine Funktion, die einen int als Parameter verwendet und den korrekt formatierten String mit einem Dezimalpunkt 2 Stellen vom Ende zurückgibt.

Sagen:

int j= 123456 
Integer.toString(j); 

//processing...

//output : 1234.56
123
daverocks
int j = 123456;
String x = Integer.toString(j);
x = x.substring(0, 4) + "." + x.substring(4, x.length());
163
Mike Thomsen

Wie in Kommentaren erwähnt, ist ein StringBuilder wahrscheinlich eine schnellere Implementierung als ein StringBuffer . Wie in den Java-Dokumenten erwähnt: 

Diese Klasse stellt eine API bereit, die mit StringBuffer kompatibel ist, jedoch keine Garantie für die Synchronisierung bietet. Diese Klasse ist für die Verwendung als Drop-In-Ersatz für StringBuffer an Stellen vorgesehen, an denen der Zeichenfolgepuffer von einem einzelnen Thread verwendet wurde (wie es im Allgemeinen der Fall ist). Nach Möglichkeit wird empfohlen, diese Klasse gegenüber StringBuffer zu bevorzugen, da dies bei den meisten Implementierungen schneller ist.

Verwendungszweck : 

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

Oder wenn Sie eine Synchronisation benötigen, verwenden Sie den StringBuffer mit ähnlicher Verwendung:

String str = Integer.toString(j);
str = new StringBuffer(str).insert(str.length()-2, ".").toString();
187
blo0p3r
int yourInteger = 123450;
String s = String.format("%6.2f", yourInteger / 100.0);
System.out.println(s);
16
Itay Maman

In den meisten Anwendungsfällen ist die Verwendung einer StringBuilder (wie bereits beantwortet) eine gute Möglichkeit, dies zu tun. Wenn es auf die Leistung ankommt, kann dies jedoch eine gute Alternative sein.

/**
 * 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
rmuller

Du könntest benutzen 

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

Laut den Kommentaren wäre 12345/100.0 besser als die Verwendung von double anstelle von Float.

3
Joseph Ottinger
  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;
}
0
Miya

Ich denke, eine einfachere und elegantere Lösung zum Einfügen eines Strings in einer bestimmten Position wäre dieser Einzeiler:

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

So fügen Sie beispielsweise einen fehlenden : in eine Zeitzeichenfolge ein:

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

Es werden position-Zeichen vom Anfang der Zeichenfolge abgeglichen, gruppiert und die Gruppe durch sich selbst ($1) ersetzt, gefolgt von der insert-Zeichenfolge. Beachten Sie das replaceAll, obwohl es immer ein Vorkommen gibt, da der erste Parameter ein regulärer Ausdruck sein muss.

Natürlich hat es nicht die gleiche Leistung wie die StringBuilder-Lösung, aber ich glaube, dass die Prägnanz und Eleganz als einfacher und einfacher zu lesender Einzeiler (verglichen mit einer großen Methode) ausreicht, um ihn bei den meisten Nicht-Performance-Lösungen zu bevorzugen -kritische Anwendungsfälle.

Hinweis Ich löse das generische Problem im Titel aus Dokumentationsgründen. Wenn Sie mit Dezimalzahlen arbeiten, sollten Sie die bereits vorgeschlagenen domänenspezifischen Lösungen verwenden.

0
Luan Nico

Mit ApacheCommons3 StringUtils können Sie dies auch tun

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

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

grundsätzlich handelt es sich um eine Verkettung von Teilzeichenfolgen, die jedoch kürzer ist, wenn Sie Bibliotheken verwenden möchten oder bereits von StringUtils abhängen

0
gherkin

Wenn Sie ein System verwenden, in dem Float teuer ist (z. B. keine FPU) oder nicht zulässig ist (z. B. in der Buchhaltung), können Sie Folgendes verwenden

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

Ansonsten ist DecimalFormat die bessere Lösung. (Die StringBuilder-Variante oben funktioniert nicht mit kleinen Zahlen (<100)

0
rurouni
// 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());
0
Nagendra Mishra

Versuche dies :

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;
    }
0