parent
ad8541790d
commit
02189fb016
44
calc.go
44
calc.go
|
@ -478,6 +478,7 @@ type formulaFuncs struct {
|
||||||
// DISC
|
// DISC
|
||||||
// DMAX
|
// DMAX
|
||||||
// DMIN
|
// DMIN
|
||||||
|
// DOLLAR
|
||||||
// DOLLARDE
|
// DOLLARDE
|
||||||
// DOLLARFR
|
// DOLLARFR
|
||||||
// DPRODUCT
|
// DPRODUCT
|
||||||
|
@ -16341,6 +16342,49 @@ func (fn *formulaFuncs) DISC(argsList *list.List) formulaArg {
|
||||||
return fn.discIntrate("DISC", argsList)
|
return fn.discIntrate("DISC", argsList)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DOLLAR function rounds a supplied number to a specified number of decimal
|
||||||
|
// places and then converts this into a text string with a currency format. The
|
||||||
|
// syntax of the function is:
|
||||||
|
//
|
||||||
|
// DOLLAR(number,[decimals])
|
||||||
|
func (fn *formulaFuncs) DOLLAR(argsList *list.List) formulaArg {
|
||||||
|
if argsList.Len() == 0 {
|
||||||
|
return newErrorFormulaArg(formulaErrorVALUE, "DOLLAR requires at least 1 argument")
|
||||||
|
}
|
||||||
|
if argsList.Len() > 2 {
|
||||||
|
return newErrorFormulaArg(formulaErrorVALUE, "DOLLAR requires 1 or 2 arguments")
|
||||||
|
}
|
||||||
|
numArg := argsList.Front().Value.(formulaArg)
|
||||||
|
n := numArg.ToNumber()
|
||||||
|
if n.Type != ArgNumber {
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
decimals, dot, value := 2, ".", numArg.Value()
|
||||||
|
if argsList.Len() == 2 {
|
||||||
|
d := argsList.Back().Value.(formulaArg).ToNumber()
|
||||||
|
if d.Type != ArgNumber {
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
if d.Number < 0 {
|
||||||
|
value = strconv.FormatFloat(fn.round(n.Number, d.Number, down), 'f', -1, 64)
|
||||||
|
}
|
||||||
|
if d.Number >= 128 {
|
||||||
|
return newErrorFormulaArg(formulaErrorVALUE, "decimal value should be less than 128")
|
||||||
|
}
|
||||||
|
if decimals = int(d.Number); decimals < 0 {
|
||||||
|
decimals, dot = 0, ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
symbol := map[CultureName]string{
|
||||||
|
CultureNameUnknown: "$",
|
||||||
|
CultureNameEnUS: "$",
|
||||||
|
CultureNameZhCN: "¥",
|
||||||
|
}[fn.f.options.CultureInfo]
|
||||||
|
numFmtCode := fmt.Sprintf("%s#,##0%s%s;(%s#,##0%s%s)",
|
||||||
|
symbol, dot, strings.Repeat("0", decimals), symbol, dot, strings.Repeat("0", decimals))
|
||||||
|
return newStringFormulaArg(format(value, numFmtCode, false, CellTypeNumber, nil))
|
||||||
|
}
|
||||||
|
|
||||||
// DOLLARDE function converts a dollar value in fractional notation, into a
|
// DOLLARDE function converts a dollar value in fractional notation, into a
|
||||||
// dollar value expressed as a decimal. The syntax of the function is:
|
// dollar value expressed as a decimal. The syntax of the function is:
|
||||||
//
|
//
|
||||||
|
|
16
calc_test.go
16
calc_test.go
|
@ -2117,6 +2117,16 @@ func TestCalcCellValue(t *testing.T) {
|
||||||
"=DDB(10000,1000,5,5)": "296",
|
"=DDB(10000,1000,5,5)": "296",
|
||||||
// DISC
|
// DISC
|
||||||
"=DISC(\"04/01/2016\",\"03/31/2021\",95,100)": "0.01",
|
"=DISC(\"04/01/2016\",\"03/31/2021\",95,100)": "0.01",
|
||||||
|
// DOLLAR
|
||||||
|
"=DOLLAR(1234.56)": "$1,234.56",
|
||||||
|
"=DOLLAR(1234.56,0)": "$1,235",
|
||||||
|
"=DOLLAR(1234.56,1)": "$1,234.6",
|
||||||
|
"=DOLLAR(1234.56,2)": "$1,234.56",
|
||||||
|
"=DOLLAR(1234.56,3)": "$1,234.560",
|
||||||
|
"=DOLLAR(1234.56,-2)": "$1,200",
|
||||||
|
"=DOLLAR(1234.56,-3)": "$1,000",
|
||||||
|
"=DOLLAR(-1234.56,3)": "($1,234.560)",
|
||||||
|
"=DOLLAR(-1234.56,-3)": "($1,000)",
|
||||||
// DOLLARDE
|
// DOLLARDE
|
||||||
"=DOLLARDE(1.01,16)": "1.0625",
|
"=DOLLARDE(1.01,16)": "1.0625",
|
||||||
// DOLLARFR
|
// DOLLARFR
|
||||||
|
@ -4250,6 +4260,12 @@ func TestCalcCellValue(t *testing.T) {
|
||||||
"=DISC(\"04/01/2016\",\"03/31/2021\",0,100)": {"#NUM!", "DISC requires pr > 0"},
|
"=DISC(\"04/01/2016\",\"03/31/2021\",0,100)": {"#NUM!", "DISC requires pr > 0"},
|
||||||
"=DISC(\"04/01/2016\",\"03/31/2021\",95,0)": {"#NUM!", "DISC requires redemption > 0"},
|
"=DISC(\"04/01/2016\",\"03/31/2021\",95,0)": {"#NUM!", "DISC requires redemption > 0"},
|
||||||
"=DISC(\"04/01/2016\",\"03/31/2021\",95,100,5)": {"#NUM!", "invalid basis"},
|
"=DISC(\"04/01/2016\",\"03/31/2021\",95,100,5)": {"#NUM!", "invalid basis"},
|
||||||
|
// DOLLAR
|
||||||
|
"DOLLAR()": {"#VALUE!", "DOLLAR requires at least 1 argument"},
|
||||||
|
"DOLLAR(0,0,0)": {"#VALUE!", "DOLLAR requires 1 or 2 arguments"},
|
||||||
|
"DOLLAR(\"\")": {"#VALUE!", "strconv.ParseFloat: parsing \"\": invalid syntax"},
|
||||||
|
"DOLLAR(0,\"\")": {"#VALUE!", "strconv.ParseFloat: parsing \"\": invalid syntax"},
|
||||||
|
"DOLLAR(1,200)": {"#VALUE!", "decimal value should be less than 128"},
|
||||||
// DOLLARDE
|
// DOLLARDE
|
||||||
"=DOLLARDE()": {"#VALUE!", "DOLLARDE requires 2 arguments"},
|
"=DOLLARDE()": {"#VALUE!", "DOLLARDE requires 2 arguments"},
|
||||||
"=DOLLARDE(\"\",0)": {"#VALUE!", "strconv.ParseFloat: parsing \"\": invalid syntax"},
|
"=DOLLARDE(\"\",0)": {"#VALUE!", "strconv.ParseFloat: parsing \"\": invalid syntax"},
|
||||||
|
|
Loading…
Reference in New Issue