diff --git a/kernel/av/av.go b/kernel/av/av.go index 506828568..92bfb819c 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -32,6 +32,8 @@ import ( "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/util" + "golang.org/x/text/language" + "golang.org/x/text/message" ) // AttributeView 描述了属性视图的结构。 @@ -176,12 +178,51 @@ func NewFormattedValueNumber(content float64, format NumberFormat) (ret *ValueNu } func (number *ValueNumber) FormatNumber() { - switch number.Format { + number.FormattedContent = formatNumber(number.Content, number.Format) +} + +func formatNumber(content float64, format NumberFormat) string { + switch format { case NumberFormatNone: - number.FormattedContent = strconv.FormatFloat(number.Content, 'f', -1, 64) + return strconv.FormatFloat(content, 'f', -1, 64) + case NumberFormatCommas: + p := message.NewPrinter(language.English) + return p.Sprintf("%d", content) case NumberFormatPercent: - s := fmt.Sprintf("%.2f", number.Content*100) - number.FormattedContent = strings.TrimRight(strings.TrimRight(s, "0"), ".") + "%" + 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) + case NumberFormatYuan: + p := message.NewPrinter(language.Chinese) + return p.Sprintf("CN¥%d", content) + case NumberFormatEuro: + p := message.NewPrinter(language.German) + return p.Sprintf("€%d", content) + case NumberFormatPound: + p := message.NewPrinter(language.English) + return p.Sprintf("£%d", content) + case NumberFormatYen: + p := message.NewPrinter(language.Japanese) + return p.Sprintf("¥%d", content) + case NumberFormatRuble: + p := message.NewPrinter(language.Russian) + return p.Sprintf("₽%d", content) + case NumberFormatRupee: + p := message.NewPrinter(language.Hindi) + return p.Sprintf("₹%d", content) + case NumberFormatWon: + p := message.NewPrinter(language.Korean) + return p.Sprintf("₩%d", content) + case NumberFormatCanadianDollar: + p := message.NewPrinter(language.English) + return p.Sprintf("CA$%d", content) + case NumberFormatFranc: + p := message.NewPrinter(language.French) + return p.Sprintf("CHF%d", content) + default: + return strconv.FormatFloat(content, 'f', -1, 64) } } diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 2efca257a..a22809213 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -149,6 +149,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a Sorts: view.Table.Sorts, } + // 组装列 for _, col := range view.Table.Columns { key, getErr := attrView.GetKey(col.ID) if nil != getErr { @@ -169,6 +170,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a }) } + // 生成行 rows := map[string][]*av.Value{} for _, keyValues := range attrView.KeyValues { for _, val := range keyValues.Values { @@ -176,6 +178,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a } } + // 过滤掉不存在的行 notFound := []string{} for blockID, _ := range rows { if treenode.GetBlockTree(blockID) == nil { @@ -186,6 +189,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a delete(rows, blockID) } + // 生成行单元格 for rowID, row := range rows { var tableRow av.TableRow for _, col := range ret.Columns { @@ -207,11 +211,17 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a } } tableRow.ID = rowID + + if av.KeyTypeNumber == tableCell.ValueType { + tableCell.Value.Number.FormatNumber() + } + tableRow.Cells = append(tableRow.Cells, tableCell) } ret.Rows = append(ret.Rows, &tableRow) } + // 自定义排序 sortRowIDs := map[string]int{} if 0 < len(view.Table.RowIDs) { for i, rowID := range view.Table.RowIDs {