可能重複:
How to do a natural sort on an NSArray?
Comparing version numbers比較兩個字符串(包含數字)
我有我的應用程序版本保存爲一個NSString。版本格式爲x.y.z或x.y(其中x,y,z表示整數)。
如果我想比較2個版本(即:代表2個不同/相同版本的2個字符串),那麼執行此操作的最佳方法是什麼?
謝謝!
Sunny
可能重複:
How to do a natural sort on an NSArray?
Comparing version numbers比較兩個字符串(包含數字)
我有我的應用程序版本保存爲一個NSString。版本格式爲x.y.z或x.y(其中x,y,z表示整數)。
如果我想比較2個版本(即:代表2個不同/相同版本的2個字符串),那麼執行此操作的最佳方法是什麼?
謝謝!
Sunny
我有同樣的問題,無法使它工作。我終於決定用NSNumber保存版本...爲我節省了很多時間...所以我建議你也這樣做
如果你已經在App Store中有這個應用程序...只是做一些事情:
NSString *string = <get version>
if ([string isKindOfClass:[NSString class]]){
update version and save as NSNumber
}
使用NSString保存版本最初看起來是個不錯的主意,但當您嘗試更新應用程序時,它的技巧非常棘手。使用的NSNumber更加容易,因爲...... well..uses數字
,所以我看遍了NSScanner Class Reference,並用此溶液想出了:
int i1,i2,i3;
NSScanner *scanner =[NSScanner alloc]initWithString:string];
BOOL scanI1 = [scanner scanInteger:&i1];
[scanner setScanLocation:3];
BOOL scanI2 = [scanner scanInteger:&i2];
[scanner setScanLocation:5];
BOOL scanI3 = [scanner scanInteger:&i3];
[scanner release];
它不漂亮,但它應該工作
你的代碼中的if語句是多餘的 - 如果你將一個變量保存到'NSString'中,檢查它是否是'NSString'將總是返回一個真值... – 2012-04-04 00:40:01
不幸的是, m從應用程序的info.plist中讀取當前版本,並將其存儲爲字符串。 – 2012-04-04 00:42:05
你有超過1個版本發佈嗎? – skytz 2012-04-04 00:43:53
有約一百萬的方式,你可以去了解這一點,但這裏是一個簡單的例子:
void versionStringComponents(NSString* versionStr_, NSInteger* major__, NSInteger* minor__, NSInteger* bugfix__)
{
NSArray* elements = [versionStr_ componentsSeparatedByString:@"."];
*major__ = [[elements objectAtIndex:0] intValue];
*minor__ = [[elements objectAtIndex:1] intValue];
*bugfix__ = 0;
if([elements count] > 2)
{
*bugfix__ = [[elements objectAtIndex:2] intValue];
}
}
bool versionLessThan(NSString* versionStr1_, NSString* versionStr2_)
{
NSInteger major1 = 0, minor1 = 0, bugfix1 = 0;
versionStringComponents(versionStr1_, &major1, &minor1, &bugfix1);
NSInteger major2 = 0, minor2 = 0, bugfix2 = 0;
versionStringComponents(versionStr2_, &major2, &minor2, &bugfix2);
return (
major1 < major2 ||
(major1 == major2 && minor1 < minor2) ||
(major1 == major2 && minor1 == minor2 && bugfix1 < bugfix2)
);
}
顯然,這是一個小巧的黑客工具,爲versionStringComponents()
只是盲目地從字符串中分離版本號,將它們轉換爲整數等。此外,它可以使用更多的比較函數,但我相信你可以把它們弄清楚。
This link,作爲mentioned by Saphrosit,是完成相同任務的更短的方法,但需要使用Sparkle框架中的代碼。
試試看。你會想要按照句點拆分字符串,轉換爲整數,而不是比較。 – sdolan 2012-04-04 00:24:42
這可能是一個比人們想象的更難的問題,這取決於你需要如何比較事物。如果您只需比較「isEqualToString:」的完全平等使用情況,但如果您需要進行相對比較和部分比較,則需要根據您需要的靈活性進行思考和計劃。 (但是請注意'componentsSeparatedByString:'可以很好地劃分一個以點分隔的版本ID。) – 2012-04-04 00:33:14
謝謝@Saphrosit。這正是我正在尋找的東西。我應該刪除這個問題嗎? – 2012-04-04 01:02:44