web-dev-qa-db-ja.com

文字列の特定の位置に文字を挿入する

私は6桁の値でintを取得しています。 Stringの末尾から2桁の位置に小数点(。)を付けたintとして表示したいです。私はfloatを使いたかったのですが、より良い表示出力のためにStringを使うことが推奨されました(1234.5の代わりに1234.50になります)。したがって、パラメータとしてintを受け取り、末尾から2桁の小数点付きの適切にフォーマットされたStringを返す関数が必要です。

いう:

int j= 123456 
Integer.toString(j); 

//processing...

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

コメントで述べたように、 StringBuilderStringBuffer を使用するよりもおそらく速い実装です。 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();
193
blo0p3r
int yourInteger = 123450;
String s = String.format("%6.2f", yourInteger / 100.0);
System.out.println(s);
16
Itay Maman

ほとんどのユースケースでは、(既に回答済みのように)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
rmuller

あなたが使用することができます

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

コメントによると、floatの代わりにdoubleを使用するのと同様に、12345/100.0が良いでしょう。

3
Joseph Ottinger

ApacheCommons3 StringUtilsを使って、あなたもそうすることができました

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

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

基本的にはサブストリングの連結ですが、ライブラリーを使用しても構わない場合、または既にStringUtilsに依存している場合はそれより短くなります。

1
gherkin
  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

特定の位置に文字列を挿入するためのよりシンプルでエレガントな解決策は、このワンライナーになると思います。

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

たとえば、不足している:を時間文字列に挿入するには、次のようにします。

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

つまり、文字列の先頭からposition文字を突き合わせ、それをグループ化し、そのグループをそれ自体($1)で置き換え、その後にinsertストリングを置きます。最初のパラメータは正規表現でなければならないため、replaceAllは常に1回出現しても構いません。

もちろんStringBuilderソリューションと同じパフォーマンスはありませんが、シンプルで読みやすいワンライナーとしての簡潔さと優雅さ(大規模な方法と比較して)で十分なパフォーマンスが得られることがほとんどです。重要なユースケース。

注意ドキュメントの理由からタイトルの一般的な問題は解決しています。もちろん、10進数を扱う場合は、すでに提案されているドメイン固有の解決策を使用する必要があります。

0
Luan Nico

もし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)では機能しません。

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

これを試して :

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