以下是我到目前为止所使用的代码,它不能按我的意愿工作,所以我需要一些帮助。
字符串[] FCVs
带回字符串...每个看起来都像$103,700</td><t
但有不同的数字。
我希望这些数字以整数形式返回。
该函数返回一个List,因为第一个项Description
是一个字符串。
public static List<object> processPage(string sourceCode)
{
List<object> ItemsToReturn = new List<object>();
string Description = getBetween(sourceCode, @"Description:</td><td style=""padding-top: 5px; padding-bottom: 5px; font-size: 8pt; vertical-align: top;"">", "</td>");
ItemsToReturn.Add(Description);
string FullCashValue = getBetween(sourceCode, @"Full Cash Value</a>", "<a href");
string[] FCVs = new string[2];
int index1 = FullCashValue.IndexOf("$");
FCVs[0] = FullCashValue.Substring(index1, 15).ToString(); //2014
int index2 = FullCashValue.IndexOf("$", index1 + 1);
FCVs[1] = FullCashValue.Substring(index2, 15).ToString(); //2013
int[] int_FCVs;
for (int i = 0; i < FCVs.Count(); i++)
{
Match m = Regex.Match(FCVs[I], @"[+-]?\d*\.?\d+([Ee][+-]?\d+)?");
int_FCVs[i] = m.Value;
}
foreach (int FCV in int_FCVs)
{
ItemsToReturn.Add(FCV);
}
}
答案 0 :(得分:1)
如果您根据问题here和here将HTML加载到HTMLDocument
,问题String to HtmlDocument,您可能会发现从HTML中删除各种各样的碎片更简单}。或者,如果您知道HTML是有效的XML(不是给定的!),您只需将其加载到XmlDocument中即可。在任何一种情况下,您都可以使用XPath选择器轻松提取所需的各种内容。
但是,如果给定包含您所拥有的货币值的文本,我可能会编写一个小帮助方法来从文本中提取货币值:
public static IEnumerable<string> ParseCurrencyValuesFromString( this string s )
{
for ( Match m = rxCurrencyValue.Match( s ) ; m.Success ; m.NextMatch() )
{
yield return m.Value ;
}
}
private static Regex rxCurrencyValue = new Regex( @"\$\d\d?\d?(,\d\d\d)*(\.\d+)?");
正则表达式匹配文字$
后跟一个1-3位组,后跟零或多个3位组,用逗号分隔,后跟一个可选的小数组件。例子:
$3
$32
$321
$3.97
$32,987.1234
一旦你拥有了它,它就是一个简单的Linq咒语来获得你想要的......
string text = "$1, $2.34, $123, $1,234, $12,345, $123,456, $12,345,678.9012" ;
int[] intValues = text.ParseCurrencyValuesFromString()
.Select( v => decimal.Parse(v,NumberStyles.Currency))
.Select( d => (int) Math.Round(d,MidpointRounding.ToEven))
.ToArray()
;
让正则表达式引擎为您完成工作。
如果您想获得幻想,可以使用定义的货币符号,数千个分隔符和小数点来检查当前文化并动态构建正则表达式。如果你要有负数,那么正则表达式将需要得到一点点发言人,特别是如果它们通过括在括号中来表示会计风格,但不是那么多。
答案 1 :(得分:0)
如果您只想返回一个int,它可能就像下面这样简单:
int outputValue;
int.TryParse(Regex.Replace(inputString, @"[\D]", ""), out outputValue);
这将103700放入outputValue变量中。您需要对其进行扩展,并为没有数字的项目添加处理。
答案 2 :(得分:0)
我明白了。我很亲密。完成以下代码。
public static List<object> processPage(string sourceCode)
{
//create List<object> to return
List<object> ItemsToReturn = new List<object>();
string Description = getBetween(sourceCode, @"Description:</td><td style=""padding-top: 5px; padding-bottom: 5px; font-size: 8pt; vertical-align: top;"">", "</td>");
//add description (string) to List<object>
ItemsToReturn.Add(Description);
//pull section to sort through from sourcecode
string FullCashValue = getBetween(sourceCode, @"Full Cash Value</a>", "<a href");
string[] FCVs = new string[2];
//find index of $ sign
int index1 = FullCashValue.IndexOf("$");
//find $ amount + some extra characters for wiggle room
FCVs[0] = FullCashValue.Substring(index1, 15).ToString(); //2014
int index2 = FullCashValue.IndexOf("$", index1 + 1);
FCVs[1] = FullCashValue.Substring(index2, 15).ToString(); //2013
int[] int_FCVs = new int[5];
for (int i = 0; i < FCVs.Count(); i++)
{
// replace all non-digits with ""
var m = Regex.Replace(FCVs[i], @"[^.0-9]", "");
//convert var m to Int & place into array of ints
int_FCVs[i] = Convert.ToInt32(m);
}
//put each int into ItemsToReturn (list<object>)
foreach (int FCV in int_FCVs)
{
ItemsToReturn.Add(FCV);
}
return ItemsToReturn;
}