Как вставить символ в строку в определенной позиции?

Я получаю int с 6-значным значением. Я хочу показать его как String с десятичной точкой (.) На 2 цифры с конца int. Я хотел использовать float, но было предложено использовать String для лучшего вывода на дисплей (вместо 1234.5 будет 1234.50). Поэтому мне нужна функция, которая примет параметр int as и вернет правильно отформатированный String с десятичной точкой 2 цифры с конца.

Скажи:

int j= 123456 
Integer.toString(j); 

//processing...

//output : 1234.56

Ответ 1

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

Ответ 2

Как упоминалось в комментариях, StringBuilder, вероятно, является более быстрой реализацией, чем использование StringBuffer. Как упоминалось в документации по Java:

Этот класс обеспечивает API, совместимый с StringBuffer, но без гарантии синхронизации. Этот класс предназначен для использования в качестве замены для 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();

Ответ 3

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

Ответ 4

В большинстве случаев использование 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);
}

Ответ 5

Вы можете использовать

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

В соответствии с комментариями 12345/100.0 было бы лучше, как и использование double вместо float.

Ответ 6

Используя ApacheCommons3 StringUtils, вы также можете сделать

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

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

это в основном подстрока конкатенации, но короче, если вы не возражаете против использования библиотек, или уже в зависимости от StringUtils

Ответ 7

Если вы используете систему, где 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)

Ответ 8

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

Ответ 9

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

Ответ 10

Попробуй это:

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

Ответ 11

Я думаю, что более простым и элегантным решением для вставки строки в определенную позицию будет этот однострочный шрифт:

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

Например, чтобы вставить отсутствующий : во время String:

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

Что он делает, сопоставляет символы position с начала строки, группы, которые и заменяет собой группу ($1), за которой следует строка insert. Обратите внимание на replaceAll, хотя всегда есть одно вхождение, потому что первый параметр должен быть регулярным выражением.

Конечно, он не имеет такой же производительности, как решение StringBuilder, но я считаю, что сжатость и изящество как простой и удобный для чтения однострочный (по сравнению с огромным методом) достаточно, чтобы сделать его предпочтительным решением в большинство случаев, не связанных с критикой производительности.

Примечание. Я решаю общую проблему в названии по причинам документации, конечно, если вы имеете дело с десятичными числами, вы должны использовать уже предложенные для домена решения.