type TSNumberingWare = class public function Create(number: NumberingAdapter); function GetNumberLvl(ppr: PPr); private function CalculateNumber(num_fmt: string; num: integer): string; function ChineseCountingThousand(n: integer): string; private numbering_adapter_: NumberingAdapter; num_hash_: array of tslobj; end; function TSNumberingWare.Create(number: NumberingAdapter); begin numbering_adapter_ := new NumberingAdapter(number); num_hash_ := array(); end; function TSNumberingWare.GetNumberLvl(ppr: PPr); begin num_id := ppr.NumPr.NumId.Val; if ifnil(num_id) then return array("", nil); ilvl := ppr.NumPr.Ilvl.Val; pstyle := ppr.PStyle.Val; num := numbering_adapter_.GetNumByNumId(num_id); if ifnil(num) then return array("", nil); abstract_id := num.AbstractNumId.Val; abstract_num := numbering_adapter_.GetAbstractNumByAbstractNumId(abstract_id); lvls := abstract_num.Lvls(); if ifnil(ilvl) then ilvl := "0"; for k,v in lvls do begin if ilvl and v.Ilvl = ilvl then begin lvl_text := v.LvlText.Val; if not ifarray(num_hash_[num_id]) then num_hash_[num_id] := array(0, 0, 0, 0, 0, 0, 0, 0, 0); ilvl_int := strtoint(ilvl); for i:=0 to ilvl_int do begin source_str := "%" $ (i + 1); n := num_hash_[num_id][i]; if i = ilvl_int then begin n := num_hash_[num_id][i] + 1; for j:=i+1 to length(num_hash_[num_id])-1 do num_hash_[num_id][j] := 0; end n := i = ilvl_int ? num_hash_[num_id][i] + 1 : num_hash_[num_id][i]; dest_str := {self.}CalculateNumber(v.NumFmt.Val, n); lvl_text := replaceStr(lvl_text, source_str, dest_str); end num_hash_[num_id][ilvl_int]++; if v.Suff.Val = "space" then lvl_text += " "; return array(lvl_text, v); end end return array("", nil); end function TSNumberingWare.CalculateNumber(num_fmt: string; num: integer): string; begin if num_fmt = "decimal" then return format("%d", num); else if num_fmt = "chineseCountingThousand" then return {self.}ChineseCountingThousand(num); else return format("%d", num); end; function TSNumberingWare.ChineseCountingThousand(n: integer): string; begin chinese_digits := array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九"); chinese_units := array("", "十", "百", "千"); if n < 10 then return chinese_digits[n]; result := ""; num_str := inttostr(n); len := length(num_str); for i:=1 to len do begin digit_int := strtoint(num_str[i]); if digit_int <> 0 then result += chinese_digits[digit_int] + chinese_units[len - i]; end if length(result) >= 6 and result[:6] = "一十" then result := result[4:]; return result; end;