web-dev-qa-db-fra.com

Insérer un caractère dans une chaîne à une certaine position

Je suis dans une int avec une valeur à 6 chiffres. Je souhaite l’afficher sous la forme String avec un point décimal (.) À 2 chiffres de la fin de int. Je voulais utiliser un float mais il a été suggéré d'utiliser String pour un meilleur affichage (au lieu de 1234.5 sera 1234.50). Par conséquent, j’ai besoin d’une fonction qui prendra une int en paramètre et renverra la String correctement formatée avec un point décimal à 2 chiffres de la fin.

Dire:

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

Comme mentionné dans les commentaires, un StringBuilder est probablement une implémentation plus rapide que d’utiliser un StringBuffer . Comme mentionné dans la documentation Java: 

Cette classe fournit une API compatible avec StringBuffer, mais sans garantie de synchronisation. Cette classe est conçue pour être utilisée comme remplacement immédiat de StringBuffer dans les endroits où le tampon de chaîne était utilisé par un seul thread (comme c'est généralement le cas). Dans la mesure du possible, il est recommandé d'utiliser cette classe plutôt que StringBuffer, car elle sera plus rapide dans la plupart des mises en œuvre.

Utilisation: 

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

Ou si vous avez besoin de synchronisation, utilisez StringBuffer avec un usage similaire:

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

Dans la plupart des cas d'utilisation, utiliser une StringBuilder (comme déjà répondu) est un bon moyen de le faire. Cependant, si la performance compte, cela peut être une bonne alternative.

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

Vous pourriez utiliser 

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

Selon les commentaires, 12345/100.0 serait préférable, de même que l'utilisation de double au lieu de 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

Je pense qu'une solution plus simple et plus élégante pour insérer une corde dans une certaine position serait ce one-liner:

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

Par exemple, pour insérer un : manquant dans une heure, chaîne:

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

Cela correspond aux caractères position du début de la chaîne, les groupe et remplace le groupe par lui-même ($1) suivi de la chaîne insert. Attention au replaceAll, même s'il y a toujours une occurrence, car le premier paramètre doit être une regex.

Bien sûr, il n’a pas les mêmes performances que la solution StringBuilder, mais je crois que la concision et l’élégance d’un simple support simple à lire (comparé à une méthode énorme) suffisent pour en faire la solution privilégiée dans la plupart des cas cas d'utilisation critiques.

Remarque Je résous le problème générique du titre pour des raisons de documentation. Bien entendu, si vous utilisez des nombres décimaux, vous devez utiliser les solutions spécifiques à un domaine déjà proposées.

0
Luan Nico

En utilisant ApacheCommons3 StringUtils, vous pouvez aussi faire

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

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

il s'agit essentiellement d'une concaténation de sous-chaînes, mais plus courte si vous ne craignez pas d'utiliser des bibliothèques ou dépend déjà de StringUtils

0
gherkin

Si vous utilisez un système où la méthode float est coûteuse (par exemple, pas de FPU) ou non autorisée (par exemple, en comptabilité), vous pouvez utiliser quelque chose comme ceci:

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

Sinon, DecimalFormat est la meilleure solution. (la variante de StringBuilder ci-dessus ne fonctionnera pas avec de petits nombres (<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

Essaye ça :

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
Pattanai Pornpibul