如何将一个整数转换为一个给定长度的字符串与前导零对齐?

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

89308 次浏览

简短的回答:

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

Long answer:

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

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

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

您的问题有点不同,因为您需要 假设字符而不是 附加字符。这就是为什么需要反向执行字符串,添加填充字符(因为字符串是反向的,所以现在要预先处理它们) ,然后再次反向执行整个操作以获得最终结果。

希望这个能帮上忙!

你需要处理负数吗? 如果不需要,我会直接做

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)

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月:

  • If you want leading spaces, and not zero, just leave out the 0 from the format specifier. In the above case, it'd be f"$expr%7d".Tested in 2.12.8 REPL. No need to do the string replacement as suggested in a comment, or even put an explicit space in front of 7 as suggested in another comment.
  • 如果长度是可变的,s"%${len}d".format("123")

Huynhjl 抢在我前面找到了正确答案,所以这里有一个替代方案:

"0000000" + 123 takeRight 7

如果这个问与答变成了规范的纲要,

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

padding%02d表示,0的前缀是 2的长度:

scala> val i = 9
i: Int = 9


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


scala> println(paddedVal)
09
def leftPad(s: String, len: Int, elem: Char): String = {
elem.toString * (len - s.length()) + s
}

字符串使用:

def completeTo10Digits(entity: String): String = {
val zerosToAdd = (1 to (10 - entity.length)).map(_ => "0").mkString
zerosToAdd + entity
}