对存储在字符串中的带小数的数字进行排序
Sort numbers with decimals that are stored in string
我有正在转换为字符串的数字。
例如,我有一个金额 20000,我必须将其显示为 200.00,所以我正在执行
string Amount = $"{Convert.ToDouble(x.Amount) / 100:0.00}"
然后我将它们存储到值为
的金额列表中
200.00, 30.00, 588888.00, 56.36,
我尝试按 orderby(x=>x.Anount)
排序,但这是根据第一个数字为
的字符串排序的
200.00, 30.00, 56.36, 58888.00
我希望输出排序为
30.00,
56.36,
200.00,
588888.00
尝试
orderby(x=>double.Parse(x.Amount))
将自定义比较器传递给 OrderBy。 Enumerable.OrderBy 将允许您指定您喜欢的任何比较器。
void Main()
{
string[] decimals = new string[] { "30.00", "56.36", "200.00", "588888.00" };
foreach (var dec in decimals.OrderBy(x => x, new DecimalComparer()))
{
Console.WriteLine(thing);
}
}
public class DecimalComparer: IComparer<string>
{
public int Compare(string s1, string s2)
{
if (IsDecimal(s1) && IsDecimal(s2))
{
if (Convert.ToDecimal(s1) > Convert.ToDecimal(s2)) return 1;
if (Convert.ToDecimal(s1) < Convert.ToDecimal(s2)) return -1;
if (Convert.ToDecimal(s1) == Convert.ToDecimal(s2)) return 0;
}
if (IsDecimal(s1) && !IsDecimal(s2))
return -1;
if (!IsDecimal(s1) && IsDecimal(s2))
return 1;
return string.Compare(s1, s2, true);
}
public static bool IsDecimal(object value)
{
try {
int i = Convert.ToDecimal(value.ToString());
return true;
}
catch (FormatException) {
return false;
}
}
}
这应该有效
var numberstring = "100.0,300.00,200.00,400.00";
var array = numberstring.Split(',');
var sortedstring = array.OrderBy(x => double.Parse(x)).Aggregate("", (current, val) => current + (val + ","));
您可以按长度 属性 排序,这将提供所需的顺序。例如:
IEnumerable<string> sizes = new List<string> { "200.00", "30.00", "56.36", "58888.00" };
sizes = sizes.OrderBy(x => x.Length);
一行即可完成:
var orderedAsString =
amounts.Select(x => double.Parse(x.Amount) / 100)
.OrderBy(x => x)
.Select(x => x.ToString("0.00"));
我有正在转换为字符串的数字。 例如,我有一个金额 20000,我必须将其显示为 200.00,所以我正在执行
string Amount = $"{Convert.ToDouble(x.Amount) / 100:0.00}"
然后我将它们存储到值为
的金额列表中200.00, 30.00, 588888.00, 56.36,
我尝试按 orderby(x=>x.Anount)
排序,但这是根据第一个数字为
200.00, 30.00, 56.36, 58888.00
我希望输出排序为
30.00, 56.36, 200.00, 588888.00
尝试
orderby(x=>double.Parse(x.Amount))
将自定义比较器传递给 OrderBy。 Enumerable.OrderBy 将允许您指定您喜欢的任何比较器。
void Main()
{
string[] decimals = new string[] { "30.00", "56.36", "200.00", "588888.00" };
foreach (var dec in decimals.OrderBy(x => x, new DecimalComparer()))
{
Console.WriteLine(thing);
}
}
public class DecimalComparer: IComparer<string>
{
public int Compare(string s1, string s2)
{
if (IsDecimal(s1) && IsDecimal(s2))
{
if (Convert.ToDecimal(s1) > Convert.ToDecimal(s2)) return 1;
if (Convert.ToDecimal(s1) < Convert.ToDecimal(s2)) return -1;
if (Convert.ToDecimal(s1) == Convert.ToDecimal(s2)) return 0;
}
if (IsDecimal(s1) && !IsDecimal(s2))
return -1;
if (!IsDecimal(s1) && IsDecimal(s2))
return 1;
return string.Compare(s1, s2, true);
}
public static bool IsDecimal(object value)
{
try {
int i = Convert.ToDecimal(value.ToString());
return true;
}
catch (FormatException) {
return false;
}
}
}
这应该有效
var numberstring = "100.0,300.00,200.00,400.00";
var array = numberstring.Split(',');
var sortedstring = array.OrderBy(x => double.Parse(x)).Aggregate("", (current, val) => current + (val + ","));
您可以按长度 属性 排序,这将提供所需的顺序。例如:
IEnumerable<string> sizes = new List<string> { "200.00", "30.00", "56.36", "58888.00" };
sizes = sizes.OrderBy(x => x.Length);
一行即可完成:
var orderedAsString =
amounts.Select(x => double.Parse(x.Amount) / 100)
.OrderBy(x => x)
.Select(x => x.ToString("0.00"));