Intを、先頭のゼロを揃えて指定された長さのStringに変換する方法は?


97

どのようにして変換することができInt、長い7文字にStringなるように、123になっていますか"0000123"

回答:


220

Javaライブラリーは、(優れた)かなり良い数値フォーマットのサポートを備えており、StringOpsの強化されたStringクラスからアクセスできます。

scala> "%07d".format(123)
res5: String = 0000123

scala> "%07d".formatLocal(java.util.Locale.US, 123)
res6: String = 0000123

Scala 2.10の投稿を編集2.10以降、fommilによって提案されたように、フォーマット文字列補間機能もあります(ローカライズをサポートしていません):

val expr = 123
f"$expr%07d"
f"${expr}%07d"

2019年4月を編集:

  • ゼロではなく先行スペースが必要な場合0は、フォーマット指定子からを省略してください。上記の場合、f"$expr%7d"2.12.8 REPL でテストされます。コメントで提案されているように文字列置換を行う必要はなく7、別のコメントで提案されているように前に明示的なスペースを置く必要もありません。
  • 長さが可変の場合、 s"%${len}d".format("123")

6
ベン、DHG、賛成票をありがとう、皆さんはタフな群衆ですが!私たちはまだ他の回答から何かを学ぶことができると思います、そして投票システムはどの回答が関連しているかを処理します。
huynhjl

8
この明示的である必要はありません。(スコープ内に/ f"$a%07d"がある場合)書くことができます。valvar a
fommil 2013

1
@fommil、確かに、最初の回答を投稿したときにはまだありませんでしたが、f補間器が存在するようになったため、これも使用します。
huynhjl 2013

先行ゼロの代わりに先行スペースが必要場合は、ここで説明されているように、先行ゼロをスペースで置き換えることができますregex string.replaceAll("\\G0", " ")
y2k-shubham

1
先行ゼロではなく先行スペースが必要場合は、を使用してください。"% 7d".format(123)
Erik van Oosten

36

短い答え:

"1234".reverse.padTo(7, '0').reverse

長い答え:

Scala StringOps(暗黙的な変換のためにScala文字列オブジェクトが持つ一連の優れたメソッドが含まれています)には、padTo文字列に特定の量の文字を追加するメソッドがあります。例えば:

"aloha".padTo(10,'a')

「alohaaaaaa」を返します。Stringの要素タイプはCharであるため、を囲む単一引用符に注意してください'a'

文字を付加するのではなく、付加する必要があるため、問題は少し異なります。そのため、文字列を逆にして、埋める文字を追加し(文字列が逆になっているので、今は前に付加します)、次に、全体をもう一度逆にして、最終的な結果を得る必要があります。

お役に立てれば!


14
.mkStringを使用して文字列に戻す
samthebest

2
または文字「a」を使用
ローレンスウェイガーフィールド、

29

paddingで表される%02dため0長さを作るために前置させます2

scala> val i = 9 
i: Int = 9

scala> val paddedVal = f"${num}%02d"
paddedVal: String = 09

scala> println(paddedVal)             
09

この行val paddedVal = f"${num}%02d"で変更numする必要がありますi
mjbsgll

f"$num%02d"(ここに括弧は必要ありません)
Hartmut P.

9

huynhjlが正しい答えに私を打ち負かしたので、ここに代替案があります:

"0000000" + 123 takeRight 7

これは、10Mより大きい数値では失敗します:"0000000" + Int.MaxValue takeRight 7=> 7483647。質問の文字通りの解釈によって「技術的に」正しくはありますが、数字がそれほど大きい場合、読者が埋め込み番号を7桁を超えて拡張したくないとは考えにくいでしょう。
Emil Lundberg、2017

まあ、受け入れられたソリューションとは異なり、少なくとも特定のケースでは数字がまだ正しく調整されているため、このソリューションの方が優れていると言えます。問題の要点は、数字を適切に揃えることです。
Luigi Plinge 2017

3
def leftPad(s: String, len: Int, elem: Char): String = {
 elem.toString * (len - s.length()) + s
}

1

このQ&Aが正規の概要になる場合、

scala> import java.text._
import java.text._

scala> NumberFormat.getIntegerInstance.asInstanceOf[DecimalFormat]
res0: java.text.DecimalFormat = java.text.DecimalFormat@674dc

scala> .applyPattern("0000000")

scala> res0.format(123)
res2: String = 0000123

1

負の数を処理する必要がありますか?そうでなければ、私はやるだろう

def str(i: Int) = (i % 10000000 + 10000000).toString.substring(1)

または

def str(i: Int) = { val f = "000000" + i; f.substring(f.length() - 7) }

それ以外の場合は、次を使用できますNumberFormat

val nf = java.text.NumberFormat.getIntegerInstance(java.util.Locale.US)
nf.setMinimumIntegerDigits(7)
nf.setGroupingUsed(false)
nf.format(-123)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.