如何将string.format
和printf
应用于我的输出,以便可以根据分配要求对其进行对齐?
我的方法有3个输入,其中2个是保存两个数字的char数组,还有一个保存其和的int数组。
我已经格式化了数字和总和,以便它是一个带有适当逗号的字符串。我的任务是现在对齐这些输出,以便它们始终正确对齐。问题是我不能仅仅将列宽设置为特定的数字,因为输入会因用户输入而有所不同。
Ex:用户输入数字1和数字2(最大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
如您所见,我的格式有缺陷。我完全不确定如何正确格式化此输出,以便即使每次使用不同的数字值也能正确显示。格式应为大号在小号之上,然后是总行,然后是总和。
答案 0 :(得分:1)
因此,在阅读了更多内容之后,我意识到我要实现的目标并不一定需要字符串格式或printf语句。最后,就像上面的建议一样,我只是用多个打印语句格式化了输出。绝对不是要看的最漂亮的代码,但是它为我提供了我想要的确切输出。
这是达到目的的代码:
System.out.println(" " + number1 + " +");
for(int i = 0; i < (number1.length() - number2.length()); i++){
System.out.print(" ");
}
System.out.println(" " + number2);
System.out.print(" ");
for(int j = 0; j < ((number1.length() - number2.length())+ number2.length()+1); j++){
System.out.print("-");
}
System.out.println();
System.out.print(" " + total);
答案 1 :(得分:0)
根据您的评论,似乎数学使您大跌眼镜。让我看看能否帮忙。
(您暗示这是家庭作业,因此我不会从字面上给您代码,但这应该可以使您走上正确的道路。我相信您可以自己实现它。)
数字中的位数是:
Math.floor(Math.log10(x)) + 1
(有关证明,请参见this conversation。)
使用它来找到答案的长度。 (由于您要将数字加在一起,所以它总是最长的数字或最长的数字。)使---
行如此长。
追加到每行length of that line - length of the answer
个空格的开头。
(如果您想像整个示例那样在整个问题上有一定数量的空格作为缩进,请在每行的前面附加length of line - length of answer + indent
个空格。)
在第一行末尾添加+
(空格和加号),在其他行末尾添加(两个空格)。
应该可以!
答案 2 :(得分:0)
您可以使用ArrayLists代替char数组来简化数学。但是您必须稍微调整一下代码。这是过程。
然后在“ +”和“ \ n”之后,将第二个数组列表附加到格式字符串。
最后将包含sum(A)的数组列表追加到格式字符串中。