From 65cbbc589dc09f47615f709f16a7cbfd3c6c286f Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 4 Aug 2023 00:07:12 +0800 Subject: [PATCH] :art: Attribute View number column format https://github.com/siyuan-note/siyuan/issues/8764 --- kernel/av/av.go | 29 +++++++++++++++-------------- kernel/av/table.go | 14 +++++++------- kernel/model/attribute_view.go | 2 +- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 920ae7820..a2d411c14 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -167,13 +167,13 @@ func NewFormattedValueNumber(content float64, format NumberFormat) (ret *ValueNu Format: format, FormattedContent: fmt.Sprintf("%f", content), } + + ret.FormattedContent = formatNumber(content, format) + switch format { case NumberFormatNone: s := fmt.Sprintf("%.5f", content) ret.FormattedContent = strings.TrimRight(strings.TrimRight(s, "0"), ".") - case NumberFormatPercent: - s := fmt.Sprintf("%.2f", content*100) - ret.FormattedContent = strings.TrimRight(strings.TrimRight(s, "0"), ".") + "%" } return } @@ -188,40 +188,41 @@ func formatNumber(content float64, format NumberFormat) string { return strconv.FormatFloat(content, 'f', -1, 64) case NumberFormatCommas: p := message.NewPrinter(language.English) - return p.Sprintf("%d", content) + s := p.Sprintf("%f", content) + return strings.TrimRight(strings.TrimRight(s, "0"), ".") case NumberFormatPercent: s := fmt.Sprintf("%.2f", content*100) return strings.TrimRight(strings.TrimRight(s, "0"), ".") + "%" case NumberFormatUSDollar: p := message.NewPrinter(language.English) - return p.Sprintf("$%d", content) + return p.Sprintf("$%.2f", content) case NumberFormatYuan: p := message.NewPrinter(language.Chinese) - return p.Sprintf("CN¥%d", content) + return p.Sprintf("CN¥%.2f", content) case NumberFormatEuro: p := message.NewPrinter(language.German) - return p.Sprintf("€%d", content) + return p.Sprintf("€%.2f", content) case NumberFormatPound: p := message.NewPrinter(language.English) - return p.Sprintf("£%d", content) + return p.Sprintf("£%.2f", content) case NumberFormatYen: p := message.NewPrinter(language.Japanese) - return p.Sprintf("¥%d", content) + return p.Sprintf("¥%.0f", content) case NumberFormatRuble: p := message.NewPrinter(language.Russian) - return p.Sprintf("₽%d", content) + return p.Sprintf("₽%.2f", content) case NumberFormatRupee: p := message.NewPrinter(language.Hindi) - return p.Sprintf("₹%d", content) + return p.Sprintf("₹%.2f", content) case NumberFormatWon: p := message.NewPrinter(language.Korean) - return p.Sprintf("₩%d", content) + return p.Sprintf("₩%.0f", content) case NumberFormatCanadianDollar: p := message.NewPrinter(language.English) - return p.Sprintf("CA$%d", content) + return p.Sprintf("CA$%.2f", content) case NumberFormatFranc: p := message.NewPrinter(language.French) - return p.Sprintf("CHF%d", content) + return p.Sprintf("CHF%.2f", content) default: return strconv.FormatFloat(content, 'f', -1, 64) } diff --git a/kernel/av/table.go b/kernel/av/table.go index 1ef6712a1..b774d109e 100644 --- a/kernel/av/table.go +++ b/kernel/av/table.go @@ -766,7 +766,7 @@ func (table *Table) calcColNumber(col *TableColumn, colIndex int) { sum += row.Cells[colIndex].Value.Number.Content } } - col.Calc.Result = &Value{Number: NewFormattedValueNumber(sum, NumberFormatNone)} + col.Calc.Result = &Value{Number: NewFormattedValueNumber(sum, col.NumberFormat)} case CalcOperatorAverage: sum := 0.0 count := 0 @@ -777,7 +777,7 @@ func (table *Table) calcColNumber(col *TableColumn, colIndex int) { } } if 0 != count { - col.Calc.Result = &Value{Number: NewFormattedValueNumber(sum/float64(count), NumberFormatNone)} + col.Calc.Result = &Value{Number: NewFormattedValueNumber(sum/float64(count), col.NumberFormat)} } case CalcOperatorMedian: values := []float64{} @@ -789,9 +789,9 @@ func (table *Table) calcColNumber(col *TableColumn, colIndex int) { sort.Float64s(values) if len(values) > 0 { if len(values)%2 == 0 { - col.Calc.Result = &Value{Number: NewFormattedValueNumber((values[len(values)/2-1]+values[len(values)/2])/2, NumberFormatNone)} + col.Calc.Result = &Value{Number: NewFormattedValueNumber((values[len(values)/2-1]+values[len(values)/2])/2, col.NumberFormat)} } else { - col.Calc.Result = &Value{Number: NewFormattedValueNumber(values[len(values)/2], NumberFormatNone)} + col.Calc.Result = &Value{Number: NewFormattedValueNumber(values[len(values)/2], col.NumberFormat)} } } case CalcOperatorMin: @@ -804,7 +804,7 @@ func (table *Table) calcColNumber(col *TableColumn, colIndex int) { } } if math.MaxFloat64 != min { - col.Calc.Result = &Value{Number: NewFormattedValueNumber(min, NumberFormatNone)} + col.Calc.Result = &Value{Number: NewFormattedValueNumber(min, col.NumberFormat)} } case CalcOperatorMax: max := -math.MaxFloat64 @@ -816,7 +816,7 @@ func (table *Table) calcColNumber(col *TableColumn, colIndex int) { } } if -math.MaxFloat64 != max { - col.Calc.Result = &Value{Number: NewFormattedValueNumber(max, NumberFormatNone)} + col.Calc.Result = &Value{Number: NewFormattedValueNumber(max, col.NumberFormat)} } case CalcOperatorRange: min := math.MaxFloat64 @@ -832,7 +832,7 @@ func (table *Table) calcColNumber(col *TableColumn, colIndex int) { } } if math.MaxFloat64 != min && -math.MaxFloat64 != max { - col.Calc.Result = &Value{Number: NewFormattedValueNumber(max-min, NumberFormatNone)} + col.Calc.Result = &Value{Number: NewFormattedValueNumber(max-min, col.NumberFormat)} } } } diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index bba17c2e6..7f8ea4059 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -214,7 +214,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a tableRow.ID = rowID // 格式化数字 - if av.KeyTypeNumber == tableCell.ValueType && nil != tableCell.Value && nil != tableCell.Value.Number && av.NumberFormatNone != col.NumberFormat { + if av.KeyTypeNumber == tableCell.ValueType && nil != tableCell.Value && nil != tableCell.Value.Number { tableCell.Value.Number.Format = col.NumberFormat tableCell.Value.Number.FormatNumber() }