using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using FastReport.Utils;
using System.Globalization;
namespace FastReport.Format
{
///
/// Defines how currency values are formatted and displayed.
///
public class CurrencyFormat : FormatBase
{
#region Fields
private bool useLocale;
private int decimalDigits;
private string decimalSeparator;
private string groupSeparator;
private string currencySymbol;
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 currency values.
///
[DefaultValue(2)]
public int DecimalDigits
{
get { return decimalDigits; }
set { decimalDigits = value; }
}
///
/// Gets or sets the string to use as the decimal separator in currency 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 currency values.
///
public string GroupSeparator
{
get { return groupSeparator; }
set { groupSeparator = value; }
}
///
/// Gets or sets the string to use as the currency symbol.
///
public string CurrencySymbol
{
get { return currencySymbol; }
set { currencySymbol = value; }
}
///
/// Gets or sets the format pattern for positive currency values.
///
/// This property can have one of the values in the following table.
/// The symbol "$" is the CurrencySymbol and n is a number.
///
/// ValueAssociated Pattern
/// - 0$n
/// - 1n$
/// - 2$ n
/// - 3n $
///
///
[DefaultValue(0)]
public int PositivePattern
{
get { return positivePattern; }
set { positivePattern = value; }
}
///
/// Gets or sets the format pattern for negative currency values.
///
/// This property can have one of the values in the following table.
/// The symbol "$" is the CurrencySymbol 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
/// - 10n $-
/// - 11$ n-
/// - 12$ -n
/// - 13n- $
/// - 14($ n)
/// - 15(n $)
///
///
[DefaultValue(0)]
public int NegativePattern
{
get { return negativePattern; }
set { negativePattern = value; }
}
#endregion
#region Public Methods
///
public override FormatBase Clone()
{
CurrencyFormat result = new CurrencyFormat();
result.UseLocale = UseLocale;
result.DecimalDigits = DecimalDigits;
result.DecimalSeparator = DecimalSeparator;
result.GroupSeparator = GroupSeparator;
result.CurrencySymbol = CurrencySymbol;
result.PositivePattern = PositivePattern;
result.NegativePattern = NegativePattern;
return result;
}
///
public override bool Equals(object obj)
{
CurrencyFormat f = obj as CurrencyFormat;
return f != null &&
UseLocale == f.UseLocale &&
DecimalDigits == f.DecimalDigits &&
DecimalSeparator == f.DecimalSeparator &&
GroupSeparator == f.GroupSeparator &&
CurrencySymbol == f.CurrencySymbol &&
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:c}", new object[] { value });
}
internal NumberFormatInfo GetNumberFormatInfo()
{
NumberFormatInfo info = new NumberFormatInfo();
if (UseLocale)
{
NumberFormatInfo cultureFormat = CultureInfo.CurrentCulture.NumberFormat;
info.CurrencyDecimalDigits = DecimalDigits;
info.CurrencyDecimalSeparator = cultureFormat.CurrencyDecimalSeparator;
info.CurrencyGroupSizes = cultureFormat.CurrencyGroupSizes;
info.CurrencyGroupSeparator = cultureFormat.CurrencyGroupSeparator;
info.CurrencySymbol = cultureFormat.CurrencySymbol;
info.CurrencyPositivePattern = cultureFormat.CurrencyPositivePattern;
info.CurrencyNegativePattern = cultureFormat.CurrencyNegativePattern;
}
else
{
info.CurrencyDecimalDigits = DecimalDigits;
info.CurrencyDecimalSeparator = DecimalSeparator;
info.CurrencyGroupSizes = new int[] { 3 };
info.CurrencyGroupSeparator = GroupSeparator;
info.CurrencySymbol = CurrencySymbol;
info.CurrencyPositivePattern = PositivePattern;
info.CurrencyNegativePattern = NegativePattern;
}
return info;
}
internal override string GetSampleValue()
{
return FormatValue(-12345);
}
internal override void Serialize(FRWriter writer, string prefix, FormatBase format)
{
base.Serialize(writer, prefix, format);
CurrencyFormat c = format as CurrencyFormat;
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 || CurrencySymbol != c.CurrencySymbol)
writer.WriteStr(prefix + "CurrencySymbol", CurrencySymbol);
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 CurrencyFormat class with default settings.
///
public CurrencyFormat()
{
UseLocale = true;
DecimalDigits = 2;
DecimalSeparator = ".";
GroupSeparator = ",";
CurrencySymbol = "$";
}
}
}