文字列の特定の位置に文字を挿入する方法は?


155

int6桁の値を取得しています。String末尾から2桁目を小数点(。)で表示したいint。私が使用していたfloatが、使用することを示唆されたString(の代わりに、より良いディスプレイ出力用に1234.5なります1234.50)。したがって、intパラメーターとしてas を取り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 2018

回答:


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

6
文字列は不変です。これは機能しますが、StringBuilderのようなものを使用することが道徳的に正しいことは言うまでもありません。言うまでもなく、コードが高速になります。
wheresmycookie 2013

7
StringBuilderを忘れます。このようなフォーマットでは、String.formatが利用可能な最良のオプションです。
NobleUplift 2013

33
ループはありません。これは単純な連結のケースであり、コンパイラーは文字列ビルダーを使用して最適化する必要があります。読みやすくするために、+演算子を使用することを好みます。この場合、StringBuilderを明示的に使用する必要はありません。「StringBuilder」ソリューションを使用すると、最適化ルールを尊重せずに高速になります。読みやすさのためのコード。プロファイリング後、必要な場所のみを最適化します。 en.wikipedia.org/wiki/Program_optimization#Quotes
レミモリン

17
2番目の部分文字列呼び出しでx.length()は必要ありません。
crazyGuy

1
数が異なる桁数の場合、このソリューションは失敗します。12345の場合は1234.5を出力し、1234567の場合は1234.567を出力します。あなたは、常に最後の2桁が小数点以下にしたい場合は、ことを確認してください数は、少なくとも3桁の数字を持っているし、次に行うx = x.substring(0, x.length()-2) + "." + x.substring(x.length()-2);
はTeodor Marinescuの

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 2014年

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

私がjava.math.BigDecimal使用doubleすると丸め誤差が発生する可能性があるので、使用をお勧めします。速度よりも速度の方が価値がある場合は、精度doubleが優れています。
sotrh 2014年

5

ほとんどのユースケースでは、StringBuilder(すでに回答したように)aを使用することがこれを行うための良い方法です。ただし、パフォーマンスが重要な場合は、これが適切な代替手段になる可能性があります。

/**
 * 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
うん、別の例の誰かがよりスマートである、/ 100.0 12345を使用していたと答えた(それは同じ結果に終わるが。)
ジョセフ・Ottinger

Nitpicking:12345/100 = 123は整数であり、その後のみ123.00にキャストされるため、これは正しい結果をもたらさないと思います。((float)12345/100)は機能します。
rurouni 2011

ええ、良い点-私は優先順位を考慮に入れていませんでした。主に彼が初めて実行したときに、切り捨てられた結果が得られるからです。ポスト修正します(12345/100を言うために使用され、その後、代わりに最初の値を広げる、結果をキャスト。)
ジョセフOttinger

0

フロートが高価(FPUなしなど)やシステムで使用されている場合(たとえば、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の方が適しています。
ジョセフ・オッティンガー、

@ジョセフ:あなたは正しいです。私はアカウンティングではなく、パフォーマンス上の理由から(組み込みJavaで)固定小数点表現としてほとんどintを使用しているため、BigDecimalは私の選択ではありません;-)
rurouni

0

文字列を特定の位置に挿入するためのよりシンプルでエレガントな解決策は、次の1行だと思います。

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

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

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

それが行うことは、position文字列の先頭からの文字に一致し、それをグループ化し、グループをそれ自体($1)とそれに続くinsert文字列で置き換えます。最初のパラメータは正規表現でなければならないので、常に1つしか発生しませんが、replaceAllに注意してください。

もちろん、StringBuilderソリューションと同じパフォーマンスはありませんが、シンプルで読みやすいワンライナー(巨大なメソッドと比較して)としての簡潔さと優雅さは、ほとんどの非パフォーマンスで推奨されるソリューションにするのに十分だと思います-クリティカルなユースケース。

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


0

String.format( "%0d。%02d"、d / 100、d%100);


これに反対票を投じた人には、OPが詳細に説明した内容をもう一度読んでください。これにより、問題に対する正確な答えが得られます。浮動小数点演算はありません。小数点を正しい位置に配置します。つまり、stackoverflow.com / a / 5884413/972128も同様の回答を提供しますが、浮動小数点(望ましくない)を使用しており、現時点では17の賛成票があります。
kkurian

0

コトリン男のために;)受け入れられた答え(@ 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
Stack Overflowへようこそ!一般的に、回答にコードの目的、および他の人を紹介せずに問題を解決する理由の説明が含まれている場合、回答ははるかに役立ちます。回答の参照値を改善し、理解しやすくしていただきありがとうございます。
Tim Diekmann

StringBufferは2004
。– 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.