CPF/CPF.ReoGrid/DataFormat/NumberDataFormatter.cs
2024-06-24 10:15:59 +08:00

265 lines
6.7 KiB
C#

using System;
using CPF.Drawing;
using CPF.ReoGrid.Core;
namespace CPF.ReoGrid.DataFormat
{
[DataFormat(CellDataFormatFlag.Number)]
public class NumberDataFormatter : IDataFormatter
{
public string FormatCell(Cell cell)
{
object innerData = cell.InnerData;
bool flag = false;
double num = 0.0;
bool flag2 = innerData is double;
if (flag2)
{
num = (double)innerData;
flag = true;
}
else
{
bool flag3 = innerData is int;
if (flag3)
{
num = (double)((int)innerData);
flag = true;
}
else
{
bool flag4 = innerData is long;
if (flag4)
{
num = (double)((long)innerData);
}
else
{
bool flag5 = innerData is float;
if (flag5)
{
num = (double)((float)innerData);
flag = true;
}
else
{
bool flag6 = innerData is decimal;
if (flag6)
{
num = (double)((decimal)innerData);
flag = true;
}
else
{
bool flag7 = innerData is string;
if (flag7)
{
string text = (innerData as string).Trim();
flag = double.TryParse(text, out num);
bool flag8 = !flag;
if (flag8)
{
flag = double.TryParse(text.Replace(",", ""), out num);
}
bool flag9 = flag;
if (flag9)
{
cell.InnerData = num;
}
}
else
{
bool flag10 = innerData is DateTime;
if (flag10)
{
num = ((DateTime)innerData - new DateTime(1900, 1, 1)).TotalDays;
flag = true;
}
}
}
}
}
}
}
bool flag11 = flag;
string result;
if (flag11)
{
string str = null;
string str2 = null;
NumberDataFormatter.INumberFormatArgs numberFormatArgs = cell.DataFormatArgs as NumberDataFormatter.INumberFormatArgs;
string text2 = NumberDataFormatter.FormatNumberCellAndGetPattern(cell, ref num, numberFormatArgs);
bool flag12 = numberFormatArgs is NumberDataFormatter.NumberFormatArgs;
if (flag12)
{
NumberDataFormatter.NumberFormatArgs numberFormatArgs2 = (NumberDataFormatter.NumberFormatArgs)cell.DataFormatArgs;
str = numberFormatArgs2.CustomNegativePrefix;
str2 = numberFormatArgs2.CustomNegativePostfix;
}
bool flag13 = numberFormatArgs != null && (numberFormatArgs.NegativeStyle & NumberDataFormatter.NumberNegativeStyle.CustomSymbol) == NumberDataFormatter.NumberNegativeStyle.CustomSymbol;
if (flag13)
{
text2 = ((num < 0.0) ? (str + text2 + str2) : text2);
}
result = num.ToString(text2);
}
else
{
result = null;
}
return result;
}
internal static string FormatNumberCellAndGetPattern(Cell cell, ref double value, NumberDataFormatter.INumberFormatArgs arg)
{
bool flag = cell.InnerStyle.HAlign == ReoGridHorAlign.General;
if (flag)
{
cell.RenderHorAlign = ReoGridRenderHorAlign.Right;
}
short count = 2;
bool flag2 = true;
NumberDataFormatter.NumberNegativeStyle numberNegativeStyle = NumberDataFormatter.NumberNegativeStyle.Default;
bool flag3 = arg != null;
if (flag3)
{
count = arg.DecimalPlaces;
flag2 = arg.UseSeparator;
numberNegativeStyle = arg.NegativeStyle;
}
bool flag4 = value < 0.0;
if (flag4)
{
bool flag5 = (numberNegativeStyle & NumberDataFormatter.NumberNegativeStyle.Red) == NumberDataFormatter.NumberNegativeStyle.Red;
if (flag5)
{
cell.RenderColor = Color.Red;
}
else
{
cell.RenderColor = Color.Transparent;
}
}
string str = new string('0', (int)count);
string text = (flag2 ? "#,##0." : "0.") + str;
bool flag6 = (numberNegativeStyle & NumberDataFormatter.NumberNegativeStyle.Brackets) == NumberDataFormatter.NumberNegativeStyle.Brackets;
if (flag6)
{
text = ((value < 0.0) ? ("(" + text + ")") : text);
}
else
{
bool flag7 = (numberNegativeStyle & NumberDataFormatter.NumberNegativeStyle.Prefix_Sankaku) == NumberDataFormatter.NumberNegativeStyle.Prefix_Sankaku;
if (flag7)
{
text = ((value < 0.0) ? ("▲ " + text) : text);
}
}
bool flag8 = (numberNegativeStyle & NumberDataFormatter.NumberNegativeStyle.Default) == ~(NumberDataFormatter.NumberNegativeStyle.Default | NumberDataFormatter.NumberNegativeStyle.Red | NumberDataFormatter.NumberNegativeStyle.Brackets | NumberDataFormatter.NumberNegativeStyle.Prefix_Sankaku | NumberDataFormatter.NumberNegativeStyle.CustomSymbol);
if (flag8)
{
value = Math.Abs(value);
}
return text;
}
public static NumberDataFormatter.NumberFormatArgs TwoDecimalDigitsArgument
{
get
{
return new NumberDataFormatter.NumberFormatArgs
{
DecimalPlaces = 2,
UseSeparator = true
};
}
}
public static NumberDataFormatter.NumberFormatArgs NoDecimalDigitsArgument
{
get
{
return new NumberDataFormatter.NumberFormatArgs
{
DecimalPlaces = 0,
UseSeparator = true
};
}
}
public bool PerformTestFormat()
{
return true;
}
public interface INumberFormatArgs
{
short DecimalPlaces { get; set; }
NumberDataFormatter.NumberNegativeStyle NegativeStyle { get; set; }
bool UseSeparator { get; set; }
string CustomNegativePrefix { get; set; }
string CustomNegativePostfix { get; set; }
}
[Serializable]
public class NumberFormatArgs : NumberDataFormatter.INumberFormatArgs
{
public NumberFormatArgs()
{
this.DecimalPlaces = 2;
this.NegativeStyle = NumberDataFormatter.NumberNegativeStyle.Default;
}
public short DecimalPlaces { get; set; }
public NumberDataFormatter.NumberNegativeStyle NegativeStyle { get; set; }
public bool UseSeparator { get; set; }
public string CustomNegativePrefix { get; set; }
public string CustomNegativePostfix { get; set; }
public override bool Equals(object obj)
{
bool flag = !(obj is NumberDataFormatter.NumberFormatArgs);
bool result;
if (flag)
{
result = false;
}
else
{
NumberDataFormatter.NumberFormatArgs numberFormatArgs = (NumberDataFormatter.NumberFormatArgs)obj;
result = (this.DecimalPlaces == numberFormatArgs.DecimalPlaces && this.NegativeStyle == numberFormatArgs.NegativeStyle && this.UseSeparator == numberFormatArgs.UseSeparator && this.CustomNegativePrefix == numberFormatArgs.CustomNegativePrefix && this.CustomNegativePostfix == numberFormatArgs.CustomNegativePostfix);
}
return result;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
[Flags]
public enum NumberNegativeStyle : byte
{
Default = 1,
Minus = 1,
Red = 2,
Brackets = 4,
RedMinus = 3,
BracketsMinus = 5,
RedBrackets = 6,
RedBracketsMinus = 7,
Prefix_Sankaku = 8,
CustomSymbol = 240
}
}
}