【问题标题】:Smalltalk weird printing errorSmalltalk 奇怪的打印错误
【发布时间】:2018-08-08 06:30:55
【问题描述】:

为了“填充”我正在打印的数字,使其始终是固定数量的字符,我正在根据给定数字的整数数量制作填充字符串:

pad := '    '.
(freqVal < 10) ifTrue: [ pad := '   ' ].
((freqVal < 100) & (freqVal > 9)) ifTrue: [ pad := '  ' ].
((freqVal < 1000) & (freqVal > 99)) ifTrue: [ pad := ' ' ].
stdout<<pad<<freqVal<<<<nl

但是,打印的结果总是将变量 pad 变成一个字母,而不是像我分配它的值那样的空格。如果我在最后一行之前添加pad displayNl,它会出于某种原因打印出一个字母,而不仅仅是空格。

任何想法为什么会发生这种情况?

【问题讨论】:

  • 当我在 GNU Smalltalk 中尝试此代码时,&lt;&lt;&lt;&lt;nl 位给了我一个错误并且它不会执行。如果我这样做 pad displayNl 我看不到任何无关的字符被打印出来。你看到的是什么角色?

标签: smalltalk gnu-smalltalk


【解决方案1】:

我并不特别了解 Gnu-Smalltalk。当然,有一些方便的 String 方法或格式化程序可以用于此目的。我的建议是首先将数字转换为字符串,然后使用空白填充对其进行格式化。这样你就可以避免你遇到过的类型转换问题

新的 String 方法(最好是您的 ST 发行版中的现有方法):

withLeading: aCharacter size: anInteger
   (anInteger < self size) ifTrue: [^self copyFrom: 1 to: anInteger].
   ^((self species new: anInteger - self size) atAllPut: aCharacter ), self

使用示例

9 asString withLeading: ($ ) size: 10           "result '         9'"
10 asString withLeading: ($ ) size: 10          "result '        10'"
999 asString withLeading: ($ ) size: 10         "result '       999'"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多