Wie formatiere ich einen String mit Floats in Ruby mit # {variable}?

68

Ich möchte eine Zeichenfolge formatieren, die Float-Variablen enthält, einschließlich dieser mit einer festen Anzahl von Dezimalstellen, und ich möchte dies mit dieser Art von Formatierungssyntax tun:

amount = Math::PI
puts "Current amount: #{amount}"

und ich möchte erhalten Current amount: 3.14.

Ich weiß, dass ich es schaffen kann

amount = Math::PI
puts "Current amount %.2f" % [amount]

aber ich frage, ob es möglich ist, es im #{}Weg zu tun .

marcotama
quelle
1
Es gibt unendlich viele Möglichkeiten, Programmierprobleme zu lösen, aber einige sind viel besser als andere. Warum möchten Sie nicht das richtige Werkzeug für diesen Job verwenden?
Jonas Schubert Erlandsson
Schauen Sie sich die Antworten unten an: Keiner ist so sauber wie der% -Operator. Ich bleibe dabei.
Martin

Antworten:

53

Verwendung round:

"Current amount: #{amount.round(2)}"
Björnsen
quelle
Ah, ok. Ich habe den Code in meinem IRB ausprobiert. Es hat nicht funktioniert. Aber die Ruby-Version meines Systems ist 1.8.7.
Bjoernsen
24
Ich bin mir nicht sicher - wenn
Ihre
2
In der Zwischenzeit wird 11 zu 11.0, was möglicherweise auch nicht das ist, was Sie wollen.
Philh
Ich habe gerade entdeckt amount.round(2).to_s.chomp('.0'), was hässlich ist, aber ich denke, es funktioniert für meine Zwecke.
Philh
Dies funktioniert nicht für Zahlen wie 5.684999905497534e-06 . Die a.round(5)nachgeben 1.0e-05, während '%.5f' % aAusbeuten"0.00001"
I_do_python
71

Sie können verwenden "#{'%.2f' % var}":

irb(main):048:0> num = 3.1415
=> 3.1415
irb(main):049:0> "Pi is: #{'%.2f' % num}"
=> "Pi is: 3.14"
Spajus
quelle
4
Vorsicht vor unterschiedlichen Rundungen:"%.2f" % 1.345 => "1.34" "%.2f" % 1.346 => "1.35" "%.2f" % 1.345.round(2) => "1.35" "%.2f" % 1.346.round(2) => "1.35"
Juliusz Gonera
Wäre toll, einen Link zur Dokumentation zu sehen
yegor256
34

Sie können dies tun, aber ich bevorzuge die String#%Version:

 puts "Current amount: #{format("%.2f", amount)}"

Wie @Bjoernsen hervorhob, roundist dies der einfachste Ansatz und funktioniert auch mit Standard-Ruby (1.9), nicht nur mit Rails:

http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round

Michael Kohl
quelle
Warum bevorzugen Sie die String-Version?
Bjoernsen
Weil ich versuche, die Interpolation für einfache Ausdrücke zu reservieren.
Michael Kohl
6

Ja es ist möglich:

puts "Current amount: #{sprintf('%.2f', amount)}"
Lukas Stejskal
quelle