簡體   English   中英

將C ++的sprintf格式字符串翻譯成C#的string.Format

[英]Translating C++'s sprintf format string to C#'s string.Format

我找到了以下C ++代碼(評論自己添加):

// frame_name is a char array
// prefix is std::string
// k is a for loop counter
// frames is a std::vector string
sprintf(frameName, "%s_%0*s.bmp", prefix.c_str(), k, frames[k].c_str());

然后我嘗試將其翻譯為C#

// prefix is string
// k is a for loop counter
// frames is List<string>
string frameName = string.Format("{0}_(what goes in here?).bmp", prefix, k, frames[k]);

基本上,C ++格式字符串“%s_%0 * s.bmp”的C#等價物是什么?

編輯,@ Mark Byers:

我已經嘗試了你的代碼並做了一個小測試程序:

static void Main(string[] args)
{
    List<string> frames = new List<string>();
    frames.Add("blah");
    frames.Add("cool");
    frames.Add("fsdt");

    string prefix = "prefix";
    int n = 2;
    int k = 0;
    string frameName = string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(n, '0'));
    Console.WriteLine(frameName); // outputs prefix_blah.bmp, should output prefix_00blah.bmp
    Console.ReadLine();
 }

由於某種原因,它不是填充。

編輯:搞定了; 如果n = 2,則不會填充。

要使用零填充字符串,請使用string.PadLeft

frames[k].PadLeft(n, '0')

string.Format結合使用:

int n = 15; // Get this from somewhere.
string frameName = string.Format("{0}_{1}.bmp",
                                 prefix,
                                 frames[k].PadLeft(n, '0'));

請注意,我已將k更改為n ,因為我認為這是原始代碼中的錯誤。 我認為文件名中填充的長度不太可能在循環的每次迭代中增加1。

對於像格式化的細節0*%0*s ,我會做這種方式:

string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));

如果我說得對,它將需要frames[k] ,並用0左鍵填充它。

例如:

k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";

這就是你要追求的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM