ftoa.go raw

   1  package humanize
   2  
   3  import (
   4  	"strconv"
   5  	"strings"
   6  )
   7  
   8  func stripTrailingZeros(s string) string {
   9  	if !strings.ContainsRune(s, '.') {
  10  		return s
  11  	}
  12  	offset := len(s) - 1
  13  	for offset > 0 {
  14  		if s[offset] == '.' {
  15  			offset--
  16  			break
  17  		}
  18  		if s[offset] != '0' {
  19  			break
  20  		}
  21  		offset--
  22  	}
  23  	return s[:offset+1]
  24  }
  25  
  26  func stripTrailingDigits(s string, digits int) string {
  27  	if i := strings.Index(s, "."); i >= 0 {
  28  		if digits <= 0 {
  29  			return s[:i]
  30  		}
  31  		i++
  32  		if i+digits >= len(s) {
  33  			return s
  34  		}
  35  		return s[:i+digits]
  36  	}
  37  	return s
  38  }
  39  
  40  // Ftoa converts a float to a string with no trailing zeros.
  41  func Ftoa(num float64) string {
  42  	return stripTrailingZeros(strconv.FormatFloat(num, 'f', 6, 64))
  43  }
  44  
  45  // FtoaWithDigits converts a float to a string but limits the resulting string
  46  // to the given number of decimal places, and no trailing zeros.
  47  func FtoaWithDigits(num float64, digits int) string {
  48  	return stripTrailingZeros(stripTrailingDigits(strconv.FormatFloat(num, 'f', 6, 64), digits))
  49  }
  50