如何限制输出的最大字符数? [复制]

Posted

技术标签:

【中文标题】如何限制输出的最大字符数? [复制]【英文标题】:How do I limit an output's maximum number of characters? [duplicate] 【发布时间】:2013-12-31 11:08:55 【问题描述】:

我正在尝试将数字的输出限制为 4 个字符(包括小数)。

def costEdit(nCost):
    nCost = '%.2f'%(nCost*1.25)
    nCost = nCost * 1.25
    return nCost

我希望将 nCost 截断到小数点后 2 位。例如。如果 nCost 是 8.364912734,则将其切断为 8.36 并编辑 nCost 变量以替换为该变量。有什么想法吗?

我得到了错误:

Traceback (most recent call last):
  File "C:\Python33\My Codes\TextTowns\TextTowns.py", line 59, in <module>
    costEdit(nCost)
  File "C:\Python33\My Codes\TextTowns\TextTowns.py", line 27, in costEdit
    nCost = nCost*1.25
  TypeError: can't multiply sequence by non-int of type 'float'

我将其用作:costEdit(nCost)

【问题讨论】:

术语挑剔:如果 nCost 等于 8.364912734,它不是整数。整数是整数。 我的错,谢谢:P 这是附注。如果你得到一个大于 9.99 的数字,你会遇到 5+ 个字符。限制为 2 个小数位还是只有 4 个字符更重要?你宁愿有1000而不是1000.01吗? 你希望这个函数返回一个四舍五入的字符串表示形式,还是一个实际的四舍五入数字? 这不是 python limiting floats to two decimal points 的副本。这个问题是关于 13.95 没有精确表示为 float 的事实,并且 Python 2.5 和更早的 repr-d 以不直观的方式使用此类值。 【参考方案1】:

您遇到的问题是数字和数字的字符串表示之间的混淆。这些是不同的东西。

当你这样做时:

nCost = '%.2f'%(nCost*1.25)

...您将数字乘以 1.25,然后将其替换为一个字符串,该字符串表示最多两位小数的数字。所以,当你这样做时:

    nCost = nCost * 1.25

...你试图将一个字符串乘以 1.25,这是没有意义的。


我怀疑你根本不想要一个字符串;您只是想将数字四舍五入作为数字。为此,请使用round 函数:

nCost = round(nCost*1.25, 2)

当然,只要你再次乘以 1.25,你就可以将它“取消四舍五入”一个或两个小数位:

>>> nCost = 1.33333
>>> nCost = round(nCost*1.25, 2)
>>> nCost
1.33
>>> nCost = nCost * 1.25
>>> nCost
1.6625

实际上,在对它们进行算术运算之前对其进行舍入几乎总是一个坏主意;这只会不必要地增加舍入误差。最好尽可能长时间地保持最高精度值,并在可能的最后一秒进行舍入 - 理想情况下,通过在打印/写入磁盘/等中使用 %.2f/:.2f 格式。阶段。


要记住的另一件事是,并非所有实数都可以完全表示为浮点数。因此,例如,round(13.4999, 2) 实际上是 13.949999999999999289457264。一个简单的reprstr%f 会将其打印为13.95,因此您可能没有注意到……但它仍然不完全是13.95。

解决这个问题和其他问题的最佳方法是使用Decimal 类型而不是float 类型。然后您可以将该值精确到小数点后 2 位,在小数点后 2 位的上下文中进行数学运算,等等。

【讨论】:

非常感谢!完美运行,没有瑕疵! 赠送骑士帽【参考方案2】:

一种方法是使用以下方法:

def costEdit(nCost):
    nCost = '%.2f'%(nCost*1.25)
    #nCost = nCost*1.25
    return nCost

让我为你分解一下。

走线:

'%.2f'%(nCost*1.25)

并将其分解为组件:

(' ( (%) .2f) ')%(nCost*1.25)
'' 中的所有内容都只是一个普通字符串。 % 是一个符号,意思是“稍后替换”。 .2f 是 Python 中的一个命令,用于截断小数点后 2 位。 %(nCost*1.25) 表示“nCost*1.25 是你用来代替 %”的内容

因此,它按顺序进行nCost*1.25 的数学运算,将其放入字符串中,然后切断其他所有内容,并为您提供剩下的内容。

请注意,我已重写您的 costEdit 函数以接受 nCost 作为参数。这意味着现在您可以调用:

costEdit(nCost)

任何你想要的数字,它都会做数学运算。

另请注意,我已将 print 替换为 return。这意味着现在,您必须编写:

print costEdit(80)

得到

100

但是现在这意味着您可以使用 costEdit 进行数学运算,例如:

print 4*costEdit(80)

而不是一路打印100,它只会打印

400

问题?发表评论。

编码愉快!

编辑:关于你的错误,

我想我已经复制了它并理解了问题。

当我输入时:

costEdit('15')

我明白你的错误。

这是因为当您输入costEdit('15') 时,您输入的是'15' 而不是15。如果一个值在''"" 之间,那么您正在处理一个类型 string 的值。

在 python 中,您不能将float(数字类型)与string 相乘。这就是抱怨的原因。

要纠正这种情况,只需删除引号即可。然后输入floatint(整数)类型的数字,这两者都可以乘以float1.25 内的值costEdit())。

我希望这能解决您的问题 - 我必须在晚上离开电脑。如果没有帮助,请发表评论,我明天会回来。

否则,我很高兴能提供帮助并记得为您的问题选择最佳答案,以便帮助的人获得他们的宝贵的宝贵积分sssss

【讨论】:

编辑您的原始问题——添加到最后。插入您当前使用的代码块来获取此错误,然后是此错误本身。如果我帮不了你,别人会的。 在这种情况下就好了。您可以返回并包括您输入的内容吗?如行中:costEdit(x)? @user3092506 尝试在我更新的帖子中解决您的问题。读一读。希望我能帮上忙!【参考方案3】:

Python 2.6 或更高版本,使用 format():

print('0:.3g'.format(nCost))

【讨论】:

'0:.2f'.format(nCost) 所以 2f 不是 2g 您能否也谈谈如何将这个值作为数字类型来获取?这将满足问题的“编辑要替换的 nCost 变量”部分。【参考方案4】:

您可以为浮点数使用特殊格式代码

print('0:.2f'.format(nCost))

把2f改成4f增加位数

文档(http://docs.python.org/2/library/stdtypes.html#string-formatting)

【讨论】:

这似乎不起作用,有什么想法吗?现在编码:def costEdit(): global nCost nCost = nCost * 1.25 print('0:.2g'.format(nCost)) 使用 2f 而不是 2g。那应该工作。所以“0:.2f”不是“0:.2g” 这与他现有代码中的%.2f'% 并没有什么不同。而且它并没有解决他的问题(试图将格式化的字符串乘以1.25,而不是乘以数字然后格式化)。

以上是关于如何限制输出的最大字符数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何指定使用自动适应/填充创建的最大列数重复()? [复制]

NVARCHAR(MAX) 的最大字符数是多少? [复制]

如何将文本字段中允许的最大输入值限制为 10? [复制]

如何限制 MonoTouch 中的 UITextView 字符限制? [复制]

中文本的最大长度? [复制]

如何strcpy并返回复制的字符数?