Fix UriAttribute bug, and currency formatting crash

This commit is contained in:
nicolas.dorier 2018-05-16 02:24:59 +09:00
parent 1747414a57
commit ecf03f90aa
4 changed files with 28 additions and 4 deletions

View file

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
<Version>1.0.2.19</Version>
<Version>1.0.2.20</Version>
<NoWarn>NU1701,CA1816,CA1308,CA1810,CA2208</NoWarn>
</PropertyGroup>
<ItemGroup>

View file

@ -295,7 +295,7 @@ namespace BTCPayServer.Controllers
}
public static string FormatCurrency(decimal price, string currency, CurrencyNameTable currencies)
{
var provider = ((CultureInfo)currencies.GetCurrencyProvider(currency)).NumberFormat;
var provider = currencies.GetNumberFormatInfo(currency);
var currencyData = currencies.GetCurrencyData(currency);
var divisibility = currencyData.Divisibility;
while (true)

View file

@ -40,6 +40,14 @@ namespace BTCPayServer.Services.Rates
}
static Dictionary<string, IFormatProvider> _CurrencyProviders = new Dictionary<string, IFormatProvider>();
public NumberFormatInfo GetNumberFormatInfo(string currency)
{
var data = GetCurrencyProvider(currency);
if (data is NumberFormatInfo nfi)
return nfi;
return ((CultureInfo)data).NumberFormat;
}
public IFormatProvider GetCurrencyProvider(string currency)
{
lock (_CurrencyProviders)
@ -54,7 +62,11 @@ namespace BTCPayServer.Services.Rates
}
catch { }
}
AddCurrency(_CurrencyProviders, "BTC", 8, "BTC");
foreach (var network in new BTCPayNetworkProvider(NetworkType.Mainnet).GetAll())
{
AddCurrency(_CurrencyProviders, network.CryptoCode, 8, network.CryptoCode);
}
}
return _CurrencyProviders.TryGet(currency);
}
@ -106,6 +118,17 @@ namespace BTCPayServer.Services.Rates
info.Symbol = splitted[3];
}
}
foreach (var network in new BTCPayNetworkProvider(NetworkType.Mainnet).GetAll())
{
dico.TryAdd(network.CryptoCode, new CurrencyData()
{
Code = network.CryptoCode,
Divisibility = 8,
Name = network.CryptoCode
});
}
return dico.Values.ToArray();
}

View file

@ -9,8 +9,9 @@ namespace BTCPayServer.Validation
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var str = value == null ? null : Convert.ToString(value, CultureInfo.InvariantCulture);
Uri uri;
bool valid = Uri.TryCreate(Convert.ToString(value, CultureInfo.InvariantCulture), UriKind.Absolute, out uri);
bool valid = string.IsNullOrWhiteSpace(str) || Uri.TryCreate(str, UriKind.Absolute, out uri);
if (!valid)
{