Переменная строка формата точности с плавающей точкой
Я пытаюсь напечатать числа с плавающей запятой в процентах, и я хотел бы, чтобы число цифр после десятичного знака изменялось по мере необходимости. В настоящее время у меня есть:
fmt.Printf("%.2f%%\n", 100*(value/total))
Проблема в том, что если мой процент, скажем, ровно 50, я получу следующий вывод:
50.00%
Пока что хочу получить:
50%
Есть ли способ для строки формата указать, что следует использовать максимум 2 цифры точности, но только при необходимости?
3 ответа
Там нет прямого решения с fmt
пакет.
Но вы можете удалить точку и нули в конце с помощью регулярного выражения:
r, _ := regexp.Compile(`\.?0*$`)
fmt.Printf("%s%%\n", r.ReplaceAllString(fmt.Sprintf("%.2f", 100*(value/total)),""))
Бонус: одно и то же регулярное выражение работает для любого числа конечных нулей.
Примечание: вы будете отображать 50.0041
так же, как 50
, что может быть немного вводит в заблуждение.
Там нет никакого способа сделать это внутри fmt
например, с другим флагом или что у вас есть. Вы должны будете написать логику самостоятельно. Вы могли бы сделать что-то вроде:
var final string
doubledecimal := fmt.Sprintf("%.2f", 100*value/total)
if doubledecimal[len(doubledecimal)-2:] == "00" {
final = doubledecimal[:len(doubledecimal)-3]
} else {
final = doubledecimal
}
fmt.Printf("%s%%\n, final)
Вы могли бы так же использовать strings.Split
разделить на десятичную точку и работать оттуда.
Вы даже можете настроить это, чтобы включить 50.10%
в 50.1%
,
doubledecimal := fmt.Sprintf("%.2f", 100*value/total)
// Strip trailing zeroes
for doubledecimal[len(doubledecimal)-1] == 0 {
doubledecimal = doubledecimal[:len(doubledecimal)-1]
}
// Strip the decimal point if it's trailing.
if doubledecimal[len(doubledecimal)-1] == "." {
doubledecimal = doubledecimal[:len(doubledecimal)-1]
}
fmt.Printf("%s%%\n", doubledecimal)
Одним из способов может быть оператор if, управляющий выводом на печать, т. Е. Если результат чисто делится на 1 (результат%1 == 0), то выведите результат без десятичных разрядов. В противном случае выведите в.2f, как вы сделали выше. Не уверен, что есть более короткий способ сделать это, но я думаю, что это должно сработать.