Exemplo n.º 1
0
TSharedRef<const icu::DecimalFormat> FCulture::FICUCultureImplementation::GetDecimalFormatter(const FNumberFormattingOptions* const Options)
{
	if (!ICUDecimalFormat.IsValid())
	{
		ICUDecimalFormat = CreateDecimalFormat( ICULocale );
	}

	const bool bIsDefault = Options == NULL;
	const TSharedRef<const icu::DecimalFormat> DefaultFormatter( ICUDecimalFormat.ToSharedRef() );
	if(bIsDefault)
	{
		return DefaultFormatter;
	}
	else
	{
		const TSharedRef<icu::DecimalFormat> Formatter( static_cast<icu::DecimalFormat*>(DefaultFormatter->clone()) );
		if(Options)
		{
			Formatter->setGroupingUsed(Options->UseGrouping);
			Formatter->setRoundingMode(UEToICU(Options->RoundingMode));
			Formatter->setMinimumIntegerDigits(Options->MinimumIntegralDigits);
			Formatter->setMaximumIntegerDigits(Options->MaximumIntegralDigits);
			Formatter->setMinimumFractionDigits(Options->MinimumFractionalDigits);
			Formatter->setMaximumFractionDigits(Options->MaximumFractionalDigits);
		}
		return Formatter;
	}
}
Exemplo n.º 2
0
TSharedRef<const icu::DecimalFormat, ESPMode::ThreadSafe> FCulture::FICUCultureImplementation::GetDecimalFormatter(const FNumberFormattingOptions* const Options)
{
	if (!ICUDecimalFormat_DefaultForCulture.IsValid())
	{
		ICUDecimalFormat_DefaultForCulture = CreateDecimalFormat( ICULocale );
	}

	const bool bIsCultureDefault = Options == nullptr;
	const TSharedRef<const icu::DecimalFormat, ESPMode::ThreadSafe> DefaultFormatter( ICUDecimalFormat_DefaultForCulture.ToSharedRef() );
	if (bIsCultureDefault)
	{
		return DefaultFormatter;
	}
	else if (FNumberFormattingOptions::DefaultWithGrouping().IsIdentical(*Options))
	{
		if (!ICUDecimalFormat_DefaultWithGrouping.IsValid())
		{
			const TSharedRef<icu::DecimalFormat, ESPMode::ThreadSafe> Formatter( static_cast<icu::DecimalFormat*>(DefaultFormatter->clone()) );
			Formatter->setGroupingUsed(Options->UseGrouping);
			Formatter->setRoundingMode(UEToICU(Options->RoundingMode));
			Formatter->setMinimumIntegerDigits(Options->MinimumIntegralDigits);
			Formatter->setMaximumIntegerDigits(Options->MaximumIntegralDigits);
			Formatter->setMinimumFractionDigits(Options->MinimumFractionalDigits);
			Formatter->setMaximumFractionDigits(Options->MaximumFractionalDigits);
			ICUDecimalFormat_DefaultWithGrouping = Formatter;
		}
		return ICUDecimalFormat_DefaultWithGrouping.ToSharedRef();
	}
	else if (FNumberFormattingOptions::DefaultNoGrouping().IsIdentical(*Options))
	{
		if (!ICUDecimalFormat_DefaultNoGrouping.IsValid())
		{
			const TSharedRef<icu::DecimalFormat, ESPMode::ThreadSafe> Formatter( static_cast<icu::DecimalFormat*>(DefaultFormatter->clone()) );
			Formatter->setGroupingUsed(Options->UseGrouping);
			Formatter->setRoundingMode(UEToICU(Options->RoundingMode));
			Formatter->setMinimumIntegerDigits(Options->MinimumIntegralDigits);
			Formatter->setMaximumIntegerDigits(Options->MaximumIntegralDigits);
			Formatter->setMinimumFractionDigits(Options->MinimumFractionalDigits);
			Formatter->setMaximumFractionDigits(Options->MaximumFractionalDigits);
			ICUDecimalFormat_DefaultNoGrouping = Formatter;
		}
		return ICUDecimalFormat_DefaultNoGrouping.ToSharedRef();
	}
	else
	{
		FScopeLock ScopeLock(&ICUDecimalFormatLRUCacheCS);

		const TSharedPtr<const icu::DecimalFormat, ESPMode::ThreadSafe> CachedFormatter = ICUDecimalFormatLRUCache.AccessItem(*Options);
		if (CachedFormatter.IsValid())
		{
			return CachedFormatter.ToSharedRef();
		}

		const TSharedRef<icu::DecimalFormat, ESPMode::ThreadSafe> Formatter( static_cast<icu::DecimalFormat*>(DefaultFormatter->clone()) );
		Formatter->setGroupingUsed(Options->UseGrouping);
		Formatter->setRoundingMode(UEToICU(Options->RoundingMode));
		Formatter->setMinimumIntegerDigits(Options->MinimumIntegralDigits);
		Formatter->setMaximumIntegerDigits(Options->MaximumIntegralDigits);
		Formatter->setMinimumFractionDigits(Options->MinimumFractionalDigits);
		Formatter->setMaximumFractionDigits(Options->MaximumFractionalDigits);

		ICUDecimalFormatLRUCache.Add(*Options, Formatter);

		return Formatter;
	}
}