Переменная строка формата точности с плавающей точкой

Я пытаюсь напечатать числа с плавающей запятой в процентах, и я хотел бы, чтобы число цифр после десятичного знака изменялось по мере необходимости. В настоящее время у меня есть:

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, как вы сделали выше. Не уверен, что есть более короткий способ сделать это, но я думаю, что это должно сработать.

Другие вопросы по тегам