我希望d3将我的数字格式化为2位小数,只要它具有小数值。 此外,我希望它可以使用一个单一的格式函数。
目前,我一直在使用它。有什么方法可以改善这个以便能够解决这个问题吗?
d3.format(",.2f")(10101); //10,101.00 which must be displayed as 10,000 only
d3.format(",.2f")(12334.2); //12,334.20 this is okay
答案 0 :(得分:4)
我希望它能够使用一个单一的格式函数
嗯,这是不可能的。 D3格式函数不能适应到您传递给它们的数字。
但是,您可以使用两个格式函数,并测试一下您传递的数字是否有小数位。这是一种可能的测试方法:
number % 1
对于整数返回0。
然后,在ternary operator中,您可以选择要使用的d3.format
功能:
!(number % 1) ? someFormat(number) : otherFormat(number)
这是一个演示:
var formatInteger = d3.format(",");
var formatDecimal = d3.format(",.2f");
var number1 = 10101;
var number2 = 12334.2;
function format(number){
return !(number % 1) ? formatInteger(number) : formatDecimal(number)
}
console.log(format(number1))
console.log(format(number2))
<script src="https://d3js.org/d3.v4.min.js"></script>
答案 1 :(得分:0)
如果使用'〜'删除任何尾随零,则可以得到的最接近值。因此,在您的情况下,格式为',.2〜f'。
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<script>
console.log(d3.format(",.2~f")(10101));
console.log(d3.format(",.2~f")(12334.2));
</script>
有关d3格式的更多信息,请点击此处:https://observablehq.com/@d3/d3-format
答案 2 :(得分:0)
您可以尝试以下方法:
const formattedValue = value >= 100000
? value % 1 === 0
? SI(value).replace(".0", "")
: SI(value)
: value