【发布时间】:2018-12-15 11:38:07
【问题描述】:
如何将string.format 和printf 应用到我的输出中,以便根据我的分配要求对其进行对齐?
我的方法有 3 个输入,其中 2 个是保存两个数字的 char 数组,另一个是保存它们总和的 int 数组。
我已经对数字和总和进行了格式化,使其成为一个带有适当逗号的字符串。我的任务是现在对齐这些输出,以便它们始终正确对齐。问题是我不能只将列宽设置为特定数字,因为输入因用户输入而异。
例如:用户输入 number1 和 number2(最大值为 30 位),程序将数字相加并返回总数。
这是我的代码和当前输出:
import java.util.Scanner;
import java.util.Arrays;
public class Lab8{
public static void main(String[] args){
char[] num1 = {'9','2','3','8','7','4','8','6','7','2','9'};
char[] num2 = {'3','9','9','8','3','9','2','8','3','4','9','4','5','8'};
//getNumber("First Number: ");
//getNumber("Second Number: ");
//printArray(num1);
//System.out.println();
//printArray(num2);
int[] finalTotal = sumArrays(num1,num2);
//sumArrays(num1, num2);
printOutput(num1, num2, finalTotal);
}
//--------
/** Read a line of message from keyboard and return it as an array of char
@return: Array of characters
*/
public static char[] getNumber(String msg){
String myMessage;
System.out.print(msg);
Scanner input = new Scanner(System.in);
myMessage = input.nextLine();// Read a line of message
return myMessage.toCharArray();
}
public static int[] sumArrays(char[] num1, char[] num2){
int sum= 0, carry = 0, size = 0, min = 0;
if(num1.length > num2.length){
size = num1.length + 1;
min = num2.length;
}else{
size = num2.length + 1;
min = num1.length;
}
int[] sumArray = new int[size];
int i = num1.length-1;
int j = num2.length-1;
int k = size-1;
while(i >= 0 && j >=0){
sum = Character.getNumericValue(num1[i]) + Character.getNumericValue(num2[j]) + carry;
i--;
j--;
sumArray[k] = sum % 10;
sum = sum / 10;
carry = sum % 10;
k--;
}
while(i >= 0){
sum = Character.getNumericValue(num1[i]) + carry;
sumArray[k] = sum % 10;
sum = sum / 10;
carry = sum % 10;
i--;
k--;
}
while( j >= 0){
sum = Character.getNumericValue(num2[j]) + carry;
sumArray[k] = sum % 10;
sum = sum / 10;
carry = sum % 10;
j--;
k--;
}
sumArray[k] = carry;
int[] finalSum = new int[sumArray.length-1];
finalSum = printArray(sumArray);
return finalSum;
}
public static void printOutput(char[] num1, char[] num2, int[] sum){
char[] largest = new char[1];
char[] smallest = new char[1];
char[] tmp = new char[1];
if(num2.length > num1.length){
largest = num2;
smallest = num1;
}else{
largest = num1;
smallest = num2;
}
String number1 = formatString(largest);
String number2 = formatString(smallest);
String total = formatString(sum);
System.out.printf("%s%n", number1 + " +");
for(int i = 0; i < (number1.length() - number2.length()); i++){
System.out.print(" ");
}
System.out.printf("%s%n%s%n%s", number2, totalLine(sum),total);
}
public static String formatString(char[] num){
String formattedString = "";
for(int i = 0; i < num.length; i++){
if(i == 0){
formattedString = num[num.length-1-i] + formattedString;
continue;
}
if(i % 3 == 0){
formattedString = "," + formattedString;
}
formattedString = num[num.length-1-i] + formattedString;
}
return formattedString;
}
public static String totalLine(int[] num){
String totalLine = "";
for(int i = 0; i < num.length; i++){
totalLine = "- " + totalLine;
}
return totalLine;
}
public static String formatString(int[] num){
String formattedString = "";
for(int i = 0; i < num.length; i++){
if(i == 0){
formattedString = num[num.length-1-i] + formattedString;
continue;
}
if(i % 3 == 0){
formattedString = "," + formattedString;
}
formattedString = num[num.length-1-i] + formattedString;
}
return formattedString;
}
public static int[] printArray(int[] arr){
int[] sum = new int[arr.length-1];
if(arr[0] == 0){
for(int i = 1; i < arr.length; i++){
sum[i-1] = arr[i];
}
}else{
for(int i = 0; i < arr.length; i++){
sum[i] = arr[i];
}
}
return sum;
}
}
输出(错误)
39,983,928,349,458 +
92,387,486,729
- - - - - - - - - - - - - -
40,076,315,836,187
输出(正确方式)
39,983,928,349,458 +
92,387,486,729
--------------------
40,076,315,836,187
如您所见,我的格式有缺陷。我完全不确定如何正确格式化此输出,以便每次都能正确显示,即使数值不同。它应该格式化为较大的数字在较小的数字之上,然后是总和,然后是总和。
【问题讨论】:
-
您查看过
printf及其格式说明符的文档吗?即使是对右对齐 Java printf 的简单搜索似乎也是一个好的开始,例如,我发现了这个:stackoverflow.com/questions/15961130/… -
我以前看过这个,但我看不出它对我有什么帮助。可能是我想的不够仔细。
-
嗯。接受的答案具有带宽度的字符串格式;也许我误解了。或者也许你没有阅读足够的内容并尝试任何事情。耸耸肩。无论如何,我很确定您可以对 Java 字符串进行右对齐,并且仅搜索该字符串即可找到答案。
-
您可以尝试在最小的开头插入空格。要添加的空格数 = maximum.length-smallest,length
-
你能把完整的代码贴在这里。 (formatString 和 totalLine 方法以及如何调用 printOutput 计算总和。
标签: java printf string-formatting