using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using FastReport.Utils;
using System.Globalization;
namespace FastReport.Format
{
///
/// Defines how percent values are formatted and displayed.
///
public class PercentFormat : FormatBase
{
#region Fields
private bool useLocale;
private int decimalDigits;
private string decimalSeparator;
private string groupSeparator;
private string percentSymbol;
private int positivePattern;
private int negativePattern;
#endregion
#region Properties
///
/// Gets or sets a value that determines whether to use system locale settings to format a value.
///
[DefaultValue(true)]
public bool UseLocale
{
get { return useLocale; }
set { useLocale = value; }
}
///
/// Gets or sets the number of decimal places to use in percent values.
///
[DefaultValue(2)]
public int DecimalDigits
{
get { return decimalDigits; }
set { decimalDigits = value; }
}
///
/// Gets or sets the string to use as the decimal separator in percent values.
///
public string DecimalSeparator
{
get { return decimalSeparator; }
set { decimalSeparator = value; }
}
///
/// Gets or sets the string that separates groups of digits to the left of the decimal in percent values.
///
public string GroupSeparator
{
get { return groupSeparator; }
set { groupSeparator = value; }
}
///
/// Gets or sets the string to use as the percent symbol.
///
public string PercentSymbol
{
get { return percentSymbol; }
set { percentSymbol = value; }
}
///
/// Gets or sets the format pattern for positive percent values.
///
/// This property can have one of the values in the following table.
/// The symbol "%" is the PercentSymbol and n is a number.
///
/// ValueAssociated Pattern
/// - 0n %
/// - 1n%
/// - 2%n
/// - 3% n
///
///
[DefaultValue(0)]
public int PositivePattern
{
get { return positivePattern; }
set { positivePattern = value; }
}
///
/// Gets or sets the format pattern for negative percent values.
///
/// This property can have one of the values in the following table.
/// The symbol "%" is the PercentSymbol and n is a number.
///
/// ValueAssociated Pattern
/// - 0 -n %
/// - 1 -n%
/// - 2 -%n
/// - 3 %-n
/// - 4 %n-
/// - 5 n-%
/// - 6 n%-
/// - 7 -%n
/// - 8 n %-
/// - 9 % n-
/// - 10% -n
/// - 11n- %
///
///
[DefaultValue(0)]
public int NegativePattern
{
get { return negativePattern; }
set { negativePattern = value; }
}
#endregion
#region Public Methods
///
public override FormatBase Clone()
{
PercentFormat result = new PercentFormat();
result.UseLocale = UseLocale;
result.DecimalDigits = DecimalDigits;
result.DecimalSeparator = DecimalSeparator;
result.GroupSeparator = GroupSeparator;
result.PercentSymbol = PercentSymbol;
result.PositivePattern = PositivePattern;
result.NegativePattern = NegativePattern;
return result;
}
///
public override bool Equals(object obj)
{
PercentFormat f = obj as PercentFormat;
return f != null &&
UseLocale == f.UseLocale &&
DecimalDigits == f.DecimalDigits &&
DecimalSeparator == f.DecimalSeparator &&
GroupSeparator == f.GroupSeparator &&
PercentSymbol == f.PercentSymbol &&
PositivePattern == f.PositivePattern &&
NegativePattern == f.NegativePattern;
}
///
public override int GetHashCode()
{
return base.GetHashCode();
}
///
public override string FormatValue(object value)
{
if (value is Variant)
value = ((Variant)value).Value;
return String.Format(GetNumberFormatInfo(), "{0:p}", new object[] { value });
}
internal NumberFormatInfo GetNumberFormatInfo()
{
NumberFormatInfo info = new NumberFormatInfo();
if (UseLocale)
{
NumberFormatInfo cultureFormat = CultureInfo.CurrentCulture.NumberFormat;
info.PercentDecimalDigits = DecimalDigits;
info.PercentDecimalSeparator = cultureFormat.PercentDecimalSeparator;
info.PercentGroupSizes = cultureFormat.PercentGroupSizes;
info.PercentGroupSeparator = cultureFormat.PercentGroupSeparator;
info.PercentSymbol = cultureFormat.PercentSymbol;
info.PercentPositivePattern = cultureFormat.PercentPositivePattern;
info.PercentNegativePattern = cultureFormat.PercentNegativePattern;
}
else
{
info.PercentDecimalDigits = DecimalDigits;
info.PercentDecimalSeparator = DecimalSeparator;
info.PercentGroupSizes = new int[] { 3 };
info.PercentGroupSeparator = GroupSeparator;
info.PercentSymbol = PercentSymbol;
info.PercentPositivePattern = PositivePattern;
info.PercentNegativePattern = NegativePattern;
}
return info;
}
internal override string GetSampleValue()
{
return FormatValue(1.23f);
}
internal override void Serialize(FRWriter writer, string prefix, FormatBase format)
{
base.Serialize(writer, prefix, format);
PercentFormat c = format as PercentFormat;
if (c == null || UseLocale != c.UseLocale)
writer.WriteBool(prefix + "UseLocale", UseLocale);
if (c == null || DecimalDigits != c.DecimalDigits)
writer.WriteInt(prefix + "DecimalDigits", DecimalDigits);
if (!UseLocale)
{
if (c == null || DecimalSeparator != c.DecimalSeparator)
writer.WriteStr(prefix + "DecimalSeparator", DecimalSeparator);
if (c == null || GroupSeparator != c.GroupSeparator)
writer.WriteStr(prefix + "GroupSeparator", GroupSeparator);
if (c == null || PercentSymbol != c.PercentSymbol)
writer.WriteStr(prefix + "PercentSymbol", PercentSymbol);
if (c == null || PositivePattern != c.PositivePattern)
writer.WriteInt(prefix + "PositivePattern", PositivePattern);
if (c == null || NegativePattern != c.NegativePattern)
writer.WriteInt(prefix + "NegativePattern", NegativePattern);
}
}
#endregion
///
/// Initializes a new instance of the PercentFormat class with default settings.
///
public PercentFormat()
{
UseLocale = true;
DecimalDigits = 2;
DecimalSeparator = ".";
GroupSeparator = ",";
PercentSymbol = "%";
}
}
}