如何将Int转换为给定长度的String,并使用前导零对齐?

问题描述 投票:79回答:7

如何将Int转换为7个字符长的String,以便123变成"0000123"

string scala formatting int
7个回答
192
投票

Java库非常好(如优秀)number formatting support可以从StringOps丰富的String类访问:

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

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

编辑后期Scala 2.10:正如fommil所建议的,从2.10开始,还有一个格式化字符串插值器(不支持本地化):

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

编辑2019年4月:

  • 如果你想要前导空格而不是零,只需要从格式说明符中省略0。在上面的例子中,它是f"$expr%7d".Tested in 2.12.8 REPL。无需像评论中所建议的那样进行字符串替换,或者甚至在另一条评论中建议的7前面放置一个显式空格。
  • 如果长度是可变的,s"%${len}d".format("123")

30
投票

简短回答:

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

答案很长:

Scala StringOps(包含Scala字符串对象因隐式转换而拥有的一组很好的方法)有一个padTo方法,它会在字符串中附加一定数量的字符。例如:

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

将返回“alohaaaaaa”。请注意,String的元素类型是Char,因此'a'周围的单引号。

你的问题有点不同,因为你需要先添加字符而不是附加它们。这就是为什么你需要反转字符串,附加填充字符(因为字符串被颠倒,你现在将它们预先添加),然后再次反转整个事件以获得最终结果。

希望这可以帮助!


21
投票

padding%02d表示为0加上前缀,使长度为2

scala> val i = 9 
i: Int = 9

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

scala> println(paddedVal)             
09

9
投票

huynhjl打败了我正确的答案,所以这里是另一种选择:

"0000000" + 123 takeRight 7

2
投票
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)
© www.soinside.com 2019 - 2024. All rights reserved.