如何将Int转换为给定长度的字符串,并以前导零对齐?


Answers:


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之后:根据fommil的建议,从2.10开始,还有一个格式化字符串插值器(不支持本地化):

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
Ben,dhg,感谢您的支持,但是你们是一个艰难的人群!我认为我们仍然可以从其他答案中学到一些东西,而投票系统则负责考虑哪个答案是相关的。
huynhjl

8
您不需要如此明确,就可以编写f"$a%07d"(如果您在范围内有val/ var a)。
fommil

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”。请注意,字符串的元素类型为Char,因此的单引号引起来'a'

你的问题是有点不同的,因为你需要预先考虑,而不是字符追加它们。这就是为什么您需要反转字符串,追加填充字符(由于字符串已反转,因此现在要在其前面添加字符),然后再次反转整个内容以获得最终结果。

希望这可以帮助!


14
使用.mkString变回字符串
samthebest 2013年

2
或使用字符“ a”
劳伦斯·韦格菲尔德

29

padding是由表示%02d0被前缀以使长度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"应更改numi
mjbsgll,

f"$num%02d"(此处无需括号)
Hartmut P.

9

huynhjl为我打了一个正确的答案,所以这里有一个替代方法:

"0000000" + 123 takeRight 7

对于大于10M的数字,此操作将失败:"0000000" + Int.MaxValue takeRight 7=> 7483647。尽管通过问题的字面意义“技术上”正确,但如果数字太大,读者不太希望被填充的数字超过7位。
埃米尔·伦德伯格

好吧,您可以说此解决方案更好,因为与公认的解决方案不同,至少在特定情况下数字仍然正确对齐。问题的全部重点是使数字正确对齐。
路易吉·普林格'17

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

1

如果此问与答成为规范汇编,

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.