字符串同时包含PadLeft
和PadRight
。我需要左右填充(中心对齐)。是否有标准化的方法来实现这一目标,或者更好的是,实现同一目标的内在方式?
答案 0 :(得分:14)
不是我知道的。如果您发现自己经常使用扩展方法,则可以创建扩展方法。假设您希望您的字符串最终位于中心,请使用以下内容
public string PadBoth(string source, int length)
{
int spaces = length - source.Length;
int padLeft = spaces/2 + source.Length;
return source.PadLeft(padLeft).PadRight(length);
}
要使其成为扩展方法,请执行以下操作:
namespace System
{
public static class StringExtensions
{
public static string PadBoth(this string str, int length)
{
int spaces = length - str.Length;
int padLeft = spaces / 2 + str.Length;
return str.PadLeft(padLeft).PadRight(length);
}
}
}
顺便说一句,我只是将我的扩展包含在系统命名空间中 - 这取决于你所做的事情。
答案 1 :(得分:3)
这是一个自定义实现,不需要重建字符串。
它也适用于奇数
static string PadCenter(string text, int newWidth)
{
const char filler = ' ';
int length = text.Length;
int charactersToPad = newWidth - length;
if (charactersToPad < 0) throw new ArgumentException("New width must be greater than string length.", "newWidth");
int padLeft = charactersToPad/2 + charactersToPad%2;
//add a space to the left if the string is an odd number
int padRight = charactersToPad/2;
StringBuilder resultBuilder = new StringBuilder(newWidth);
for (int i = 0; i < padLeft; i++) resultBuilder.Insert(i, filler);
for (int i = 0; i < length; i++) resultBuilder.Insert(i + padLeft, text[i]);
for (int i = newWidth - padRight; i < newWidth; i++) resultBuilder.Insert(i, filler);
return resultBuilder.ToString();
}
答案 2 :(得分:1)
你可以自己做这件事:
string test = "Wibble";
int padTo = 12;
int padSize = (padTo - test.Length) / 2;
if (padSize > 0) {
test = test.Trim().PadLeft(test.Length + padSize).PadRight(test.Length + 2 * padSize);
}
根据需要调整此值以处理奇数填充长度,并使其成为一种扩展方法,如果这样可以让您的生活更轻松。
答案 3 :(得分:1)
这是@ david-colwell的extension方法的略微改进版本,也可以选择使用填充字符:
namespace System
{
public static class StringExtensions
{
public static string PadSides(this string str, int totalWidth, char paddingChar = ' ')
{
int padding = totalWidth - str.Length;
int padLeft = padding / 2 + str.Length;
return str.PadLeft(padLeft, paddingChar).PadRight(totalWidth, paddingChar);
}
}
}
答案 4 :(得分:0)
我认为这有点改进。
import java.util.*;
public class Test1
{
static Scanner userInput = new Scanner(System.in);
public static void main(String[] args)
{
Scanner numbers = new Scanner(System.in);
System.out.println("Please enter a number: ");
double first = numbers.nextInt();
System.out.println("Please enter a number: ");
double second = numbers.nextInt();
System.out.println("Please enter a number: ");
double third = numbers.nextInt();
System.out.println("Please enter a number: ");
double fourth = numbers.nextInt();
System.out.println("Please enter a number: ");
double fifth = numbers.nextInt();
System.out.println("The average is\t" + ((first + second + third + fourth + fifth)/5)+"\t");
}
}
答案 5 :(得分:0)
阅读本文后,我想提供另一个有用的功能(在打印方面)。
这不是这个问题的答案,而是以此为基础。
基于@orad 的回答。
public static string PadSplit(string str1, string str2, int totalWidth, char paddingChar = ' ')
{
string output;
int paddingWidth = totalWidth - (str1.Length + str2.Length);
output = string.Format("{0}{1}{2}", str1, string.Empty.PadCenter(paddingWidth, paddingChar), str2);
return output;
}
PadSplit("David", "Wins", 16) => "David Wins"
答案 6 :(得分:-1)
您也可以像这样创建扩展程序:
public static string PadBoth(this string s, int padValue)
{
return s.PadLeft(padValue).PadRight(padValue);
}
并在字符串上使用PadBoth方法。
答案 7 :(得分:-1)
/* Output looks like this
*****Luke*****
*****Leia*****
*****Han******
**Chewbecca*** */
string result = "";
string names = "Luke,Leia,Han,Chewbecca";
string[] charA = names.Split(',');
for (int i = 0; i < charA.Length; i++)
{
int padLeft = (14 - charA[i].Length) / 2;
string temp = charA[i].PadLeft(charA[i].Length + padLeft, '*');
result += temp.PadRight(14, '*') + "\n";
}
Console.WriteLine(result);